文章目录
1.观察者模式定义
定义一种订阅机制, 可在对象事件发生时通知多个 "观察" 该对象的其他对象
如果你订阅了一份杂志或报纸, 那就不需要再去报摊查询新出版的刊物了。 出版社 (即应用中的 "发布者") 会在刊物出版后 (甚至提前) 直接将最新一期寄送至你的邮箱中。
出版社负责维护订阅者列表, 了解订阅者对哪些刊物感兴趣。 当订阅者希望出版社停止寄送新一期的杂志时, 他们可随时从该列表中退出。
2.UML类图
3.实现代码
观察者:
csharp
// 观察者接口
public interface IObserver
{
void Update(ISubject subject);
}
// 具体观察者A
public class ObserverA : IObserver
{
public void Update(ISubject subject)
{
Console.WriteLine(string.Format("ObserverA observe Subject change:StateNum={0}", (subject as Subject).StateNum));
}
}
// 具体观察者B
public class ObserverB : IObserver
{
public void Update(ISubject subject)
{
Console.WriteLine(string.Format("ObserverB observe Subject change:StateNum={0}", (subject as Subject).StateNum));
}
}
被观察者:
csharp
// 被观察者接口
public interface ISubject
{
// 订阅
void Subscribe(IObserver observer);
// 取消订阅
void Unsubscribe(IObserver IObserver);
// 广播
void Notify();
}
// 具体被观察者
public class Subject : ISubject
{
// 状态数字
public int StateNum{get; set;}
private List<IObserver> _observables = new List<IObserver>();
public void Notify()
{
StateNum = new Random().Next(0, 10);
Console.WriteLine(string.Format("StateNum Change:StateNum={0}", StateNum));
foreach (var observer in _observables)
{
observer.Update(this);
}
}
public void Subscribe(IObserver observer)
{
_observables.Add(observer);
}
public void Unsubscribe(IObserver observer)
{
_observables.Remove(observer);
}
}
使用:
csharp
Subject subject = new Subject();
var observeA = new ObserverA();
var observeB = new ObserverB();
subject.Subscribe(observeA);
subject.Subscribe(observeB);
subject.Notify();
subject.Unsubscribe(observeA);
subject.Notify();
StateNum Change:StateNum=2
ObserverA observe Subject change:StateNum=2
ObserverB observe Subject change:StateNum=2
StateNum Change:StateNum=5
ObserverB observe Subject change:StateNum=5