Net设计模式之观察者模式(Observer Pattern)(1)
一、观察者模式简介(Brief Introduction)
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化的时,会通知所有观察者对象,使他们能够自动更新自己。
二、解决的问题(What To Solve)
当一个对象的改变需要同时改变其他对象的时候,而且不知道有多少对象有待改变时,应该考虑使用观察者模式。
观察者模式所做的工作其实就是解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使的各自的变化都不会影响另一边的变化。
三、观察者模式分析(Analysis)
1、观察者模式结构
public void Notify()
{
foreach(Observer o in observers)
{
o.Update();
}
ConcreteSubject类: 具体的主题,将有关状态存入具体观察者对象,在具体主题的内部状态改变时,给所有登记国的观察者发出通知。
Observer类:抽象观察者,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己
ConcreteObserver:具体观察者,实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调
2、源代码
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);
}
/// <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();
}
}
}
|
2、ConcreteSubject类,具体主题或者具体通知者
|
public class ConcreteSubject:Subject
{
private string _subjectState;
/// <summary>
/// 具体被观察者状态
/// </summary>
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();
}
|
3、程序运行结果
本文转自 灵动生活 51CTO博客,原文链接:http://blog.51cto.com/smartlife/258930,如需转载请自行联系原作者