- 觀察者模式一種一對多的關係,讓多個觀察者物件同時監聽某主題物件。物件再狀態發生變化時,會通知觀察者物件,使他門能夠自動更新自己。
- 動機
- 將一個系統分割成一系列相互協作的類別有一個很不好的副作用,那就是需要維護相關物件間的一致性。我們不希望為了維持一致性而使各類別緊密耦合,這樣會給維護、擴展和重用都帶來不便。
- 一個物件的改變需要同時改變其他物件時。且它不知道到底有多少物件有待改變時,應該考慮使用觀察者模式。
using System;
using System.Collections;
using System.Collections.Generic;
namespace DPExample
{
delegate void EventHandler();
// 通知者界面
interface Subject
{
void Notify();
string SubjectState
{
get;
set;
}
}
class Boss: Subject
{
// 宣告委託
public event EventHandler Update;
private string action;
// 通知
public void Notify()
{
Update();
}
// 老闆狀態
public string SubjectState {
get { return action; }
set { action = value; }
}
}
class Secretary: Subject
{
// 宣告委託
public event EventHandler Update;
private string action;
// 通知
public void Notify()
{
Update();
}
// 老闆狀態
public string SubjectState {
get { return action; }
set { action = value; }
}
}
// 觀察者
abstract class Observer
{
protected string name;
protected Subject sub;
public Observer (string name, Subject sub)
{
this.name = name;
this.sub = sub;
}
public abstract void Update();
}
class StockObserver
{
private string name;
private Subject sub;
public StockObserver(string name, Subject sub)
{
this.name = name;
this.sub = sub;
}
public void CloseStockMarket()
{
Console.WriteLine ("{0} {1} 關閉股票行情,繼續工作!", sub.SubjectState , name);
}
}
class NBAObserver
{
private string name;
private Subject sub;
public NBAObserver(string name, Subject sub)
{
this.name = name;
this.sub = sub;
}
public void CloseNBADirectSeeding()
{
Console.WriteLine ("{0} {1} 關閉 NBA 直播,繼續工作!", sub.SubjectState , name);
}
}
}

留言
張貼留言