觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象,這個主題對象在狀态發生變化的時,會通知所有觀察者對象,使他們能夠自動更新自己。
當一個對象的改變需要同時改變其他對象的時候,而且不知道有多少對象有待改變時,應該考慮使用觀察者模式。
觀察者模式所做的工作其實就是解除耦合,讓耦合的雙方都依賴于抽象,而不是依賴于具體,進而使的各自的變化都不會影響另一邊的變化。
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,如需轉載請自行聯系原作者