天天看点

Net设计模式之观察者模式(Observer Pattern)(1)

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

当一个对象的改变需要同时改变其他对象的时候,而且不知道有多少对象有待改变时,应该考虑使用观察者模式。

观察者模式所做的工作其实就是解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使的各自的变化都不会影响另一边的变化。

public void Notify()

{

    foreach(Observer o in observers)

    {

          o.Update();

    }

ConcreteSubject类: 具体的主题,将有关状态存入具体观察者对象,在具体主题的内部状态改变时,给所有登记国的观察者发出通知。

Observer类:抽象观察者,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己

ConcreteObserver:具体观察者,实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调

1、Subject类,主题或者抽象通知者

public abstract class Subject

    private IList<Observer> observers = new List<Observer>();

    /// <summary>

    /// 添加观察者

    /// </summary>

    /// <param name="observer">观察者</param>

    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();

        }

}

2、ConcreteSubject类,具体主题或者具体通知者

public class ConcreteSubject:Subject

    private string _subjectState;

    /// 具体被观察者状态

    public string SubjectState

        get { return _subjectState; }

        set { _subjectState = value; }

3、Observer抽象观察者,为所有的具体观察者定义一个接口

public abstract class Observer

    public abstract void Update();

4、ConcreteObserver具体观察者

/// <summary>

/// 具体观察者,实现抽象观察者角色所要求的更新接口

/// 以便使本身的状态与主题的状态相协调

/// </summary>

public class ConcreteObserver:Observer

    private string name;

    private string observerState;

    private ConcreteSubject subject;

    public ConcreteSubject Subject

        get { return subject; }

        set { subject = value; }

    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);

5、客户端代码

static void Main(string[] args)

    ConcreteSubject cs = new ConcreteSubject();

    cs.Attach(new ConcreteObserver(cs,"James"));

    cs.Attach(new ConcreteObserver(cs,"Jane"));

    cs.SubjectState="OK";

    cs.Notify();

    Console.Read();

本文转自 灵动生活 51CTO博客,原文链接:http://blog.51cto.com/smartlife/258930,如需转载请自行联系原作者

继续阅读