1、结构图
2.代码
/**********************************************************
* 意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,
* 所有依赖于它的对象都得到通知并被自动更新。
* 适用性:
* 1、当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者
* 封装在独立的对象中以使它们可以各自独立地改变和复用。
* 2、当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象
* 有待改变。
* 3、当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之,
* 你不希望这些对象是紧密耦合的。
*
* 协作:
* 1、当ConcreteSubject发生任何可能导致其观察者与其本身状态不一致
* 的改变时,它将通知它的各个观察者。
* 2、在得到一个具体目标的改变的通知后,ConcreteObserver对象可向
* 目标对象查询信息。
* 3、注意发出改变请求的Observer对象并不立即更新,而是将其推迟到它从一个
* 目标得到一个通知之后。Notify不总是由目标对象调用。它也可被一个观察
* 者或其他对象调用。
* 作者:董怀信
* 日期:2009-06-09
* *******************************************************/
using System;
using System.Collections.Generic;
namespace DesignPattern.BehavioralPattern
{
/// <summary>
/// 为那些在目标发生改变时需获得通知的对象定义一个更新接口。
/// </summary>
public abstract class Observer
{
public abstract void Update();
}
/// <summary>
/// 目标知道它的观察者。可以有任何多个观察者观察同一个目标。
/// 提供注册和删除观察者对象的接口。
/// </summary>
public abstract class Subject
{
protected List<Observer> m_observerList;
public Subject()
{
m_observerList = new List<Observer>();
}
public void Attach(Observer observer)
{
m_observerList.Add(observer);
}
public void Detach(Observer observer)
{
m_observerList.Remove(observer);
}
public void Notify()
{
foreach (Observer item in m_observerList)
{
item.Update();
}
}
}
/// <summary>
/// 将有关状态存入各ConcreteObserver对象。
/// 当它的状态发生改变时,向它的各个观察者发出通知。
/// </summary>
public class ConcreteSubject : Subject
{
private string m_subjectState;
public void SetState(string state)
{
m_subjectState = state;
Console.WriteLine(" The State Of ConcreteSubject:" + m_subjectState);
}
public string GetState()
{
return m_subjectState;
}
}
/// <summary>
/// 维护一个指向ConcreteSubject对象的引用。
/// 存储有关状态,这些状态应与目标的状态保持一致。
/// 事项Observer的更新接口以使自身状态与目标的状态保持一致。
/// </summary>
public class ConcreteObserver : Observer
{
private string m_observerState;
private ConcreteSubject m_subject;
public ConcreteObserver(ConcreteSubject subject)
{
m_subject = subject;
}
public override void Update()
{
m_observerState = m_subject.GetState();
Console.WriteLine("The State Of ConcreteObserver:" + m_observerState);
}
}
/// <summary>
/// 客户测试
/// </summary>
public class Client
{
public void Test()
{
ConcreteSubject subject = new ConcreteSubject();
ConcreteObserver observer = new ConcreteObserver(subject);
subject.Attach(observer);
subject.SetState("A");
subject.Notify();
}
}
}