【设计模式】观察者模式

来源:互联网 发布:淘宝店主自拍技巧 编辑:程序博客网 时间:2024/06/08 00:12

一、定义:

       观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

二、结构图:


三、代码实现:

       Subject类:(抽象通知者)

abstract class Subject{    private IList<Observer> observers = new List<Observer>();    //增加观察者    public void Attach(Observer observer)    {        observers.Add(observer);    }    //移除观察者    public void Detach(Observer observer)    {        observers.Remove(observer);    }    //通知    public void Notify()    {        foreach (Observer o in observers)        {            o.Update();        }    }}
       Observer类(抽象观察者)

abstract class Observer{    public abstract void Update();}
       ConcreteSubject类(具体主题或具体通知者)

class ConcreteSubject : Subject{    private string subjectState;    //具体通知者状态    public string SubjectState    {        get { return subjectState; }        set { subjectState = value; }    }}
       ConcreteObserve类:

class ConcreteObserver : Observer{    private string name;    private string observerState;    private ConcreteSubject 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();}
       结果显示如下: