标签:事件 south for out prot 参考 cheng OLE 依赖关系
主题对象(布加拉提),订阅者(普罗修特、贝西),当布加拉提出现时,普罗修特和贝西做出各自反应:
// 主题接口:
// --------
interface Subject
{
//添加/删除订阅者
void Attach(Observer observer);
void Detach(Observer observer);
//通知事件
void Notify();
}
// 具体主题:
// --------
class ConcreteSubject : Subject
{
// 订阅者清单
private List<Observer> observers = new List<Observer>();
public void Attach(Observer obs)
{
observers.Add(obs);
}
public void Detach(Observer obs)
{
if (observers.Contains(obs))
observers.Remove(obs);
}
public void Notify()
{
//主题改变则通知其所有订阅者进行变化
Console.WriteLine("出现了野生布加拉提!");
foreach (Observer o in observers)
o.Update();
}
}
// 抽象订阅者:
// ----------
abstract class Observer
{
protected string name;
public Observer(string name)
{
this.name = name;
}
// 各订阅者对通知事件的反应
public abstract void Update();
}
// 具体订阅者:
// ----------
class ConcreteObserverA : Observer
{
public ConcreteObserverA(string name) : base(name) { }
public override void Update()
{
Console.WriteLine($"{name} 发动替身: \"The Grateful Dead!\"");
}
}
class ConcreteObserverB : Observer
{
public ConcreteObserverB(string name) : base(name) { }
public override void Update()
{
Console.WriteLine($"{name} 发出呐喊:\"普罗修特大哥!\"");
}
}
// 客户端:
// ------
class Client
{
static void Main(string[] args)
{
//创建主题对象(布加拉提)
ConcreteSubject Bucciarati = new ConcreteSubject();
//创建订阅者(普罗修特、贝西)
ConcreteObserverA Prosciutto = new ConcreteObserverA("普罗修特");
ConcreteObserverB Pesci = new ConcreteObserverB("贝西");
//订阅者订阅主题对象
Bucciarati.Attach(Prosciutto);
Bucciarati.Attach(Pesci);
//主题对象通知事件(布加拉提出现)
Bucciarati.Notify();
/* OUT:
出现了野生布加拉提!
普罗修特 发动替身: "The Grateful Dead!"
贝西 发出呐喊:"普罗修特大哥!"
*/
}
}
除了上面的方法,C#中提供的 委托事件机制 也可较好实现观察者模式,该示例代码:观察者模式示例_委托版 - SouthBegonia‘s Github
标签:事件 south for out prot 参考 cheng OLE 依赖关系
原文地址:https://www.cnblogs.com/SouthBegonia/p/11984014.html