观察者模式:定义一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有的观察者对象,让他们能够自动更新自己。比如老板这个主题者对象来了,就会使员工观察者对象发生状态的变化。
类图:
优点:每个类单独处理自己的职责,而且观察者和被观察者类很容易扩展。一个对象改变需要改变多个对象时,适用于该模式。
缺点:一个对象给多个对象发送消息,需要维护对象之间的一致性。我觉得还是比较耦合的。不过可以减少消息发送的层数。维护一致性就好办多了。
代码:
abstract class Subject
{
private IList<Observer> observer =new List<Observer>(); //观察者列表
public void Attach(Observer observer)
{
observers.Add(observer);
}
public void Detach(Observer observer)
{
observer.Remove(observer);
}
public void Notify()
{
foreach (Observer o in observers) //循环遍历,更新所有观察者。
{
o.Update();
}
}
}
abstract class Observer //抽象观察者类
{
public abstract void Update();
}
class ConcreteSubject:Subject //具体的主题类。
{
private string subjectState;
//具体被观察者状态
public string SubjectState
{
get{return subectState;}
set{subjectState=value;}
}
}
class ConcreteObserver:Observer //具体观察者类
{
private string name;
private string ObserverState;
private ConcreteSunject subject;
public ConcreteObserver (ConcreteSubject subject,string name)
{
this.subject =subject;
this.name=name;
}
public override void Update()
{
observerState=subject.SubjectState;
Console.WriteLine("观察者{0}的新状态是{1}",name,observerState);
}
public ConcreteSubject Subject
{
get{return subject;}
set{subject=value;}
}
}
static void Main(string[] args)
{
ConcreteSubject s =new ConcreteSubject();
s.Attach(new ConcreteObserver(s."x"));
s.Attach(new ConcreteObserver(s,"Y"));
s.Attach(new ConcreteObserver(s,"z");
s.SubjectState="ABC"; //主题对象发生变化
s.Notify(); //引起多个观察者对象发生变化
Console.Read();
}
观察者模式的学习告一段落,继续学习。