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

一、观察者模式简介(Brief Introduction

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

二、解决的问题(What To Solve

当一个对象的改变需要同时改变其他对象的时候,而且不知道有多少对象有待改变时,应该考虑使用观察者模式。
观察者模式所做的工作其实就是解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使的各自的变化都不会影响另一边的变化。

三、观察者模式分析(Analysis

1、观察者模式结构

Net设计模式之观察者模式(Observer Pattern)(1)
Subject:它把所有对观察者对象的引用保存在一个聚集里面,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
public void Notify()
{
    foreach(Observer o in observers)
    {
          o.Update();
    }
ConcreteSubject具体的主题,将有关状态存入具体观察者对象,在具体主题的内部状态改变时,给所有登记国的观察者发出通知。
 
Observer:抽象观察者,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己
ConcreteObserver:具体观察者,实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调

2、源代码

1Subject类,主题或者抽象通知者
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);
    }
 
    /// <summary>
    /// 移除观察者
    /// </summary>
    /// <param name="observer">观察者</param>
    public void Detach(Observer observer)
    {
        observers.Remove(observer);
    }
 
    /// <summary>
    /// 通知观察者
    /// </summary>
    public void Notify()
    {
        foreach (Observer o in observers)
        {
            o.Update();
        }
    }
}
 
2ConcreteSubject类,具体主题或者具体通知者
public class ConcreteSubject:Subject
{
    private string _subjectState;
 
    /// <summary>
    /// 具体被观察者状态
    /// </summary>
    public string SubjectState
    {
        get { return _subjectState; }
        set { _subjectState = value; }
    }
}
 
3Observer抽象观察者,为所有的具体观察者定义一个接口
public abstract class Observer
{
    public abstract void Update();
}
 
4ConcreteObserver具体观察者
/// <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();
}

3、程序运行结果











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