一、观察者模式简介(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
{
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,如需转载请自行联系原作者