觀察者模式(又叫釋出-訂閱模式)
原理:
定義物件間的一種一對多依賴關係,使得每當一個物件(通知者)狀態發生改變時,其相關依賴物件(觀察者)皆得到通知並被自動更新
//通知者介面
interface Subject
{
void Attach(Observer observer);
void Detach(Observer observer);
void Notify();
string SubjectState
{
get;
set;
}
}
class Secretary : Subject//祕書作為通知者
{
//同事列表
private IList<Observer> observers = new List<Observer>();
private string action;
//增加
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();
}
//前臺狀態
public string SubjectState
{
get { return action; }
set { action = value; }
}
}
class Boss : Subject//老闆作為通知者
{
//同事列表
private IList<Observer> observers = new List<Observer>();
private string action;
//增加
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();
}
//老闆狀態
public string SubjectState
{
get { return action; }
set { action = value; }
}
}
//抽象觀察者
abstract class Observer
{
protected string name;
protected Secretary sub;
public Observer(string name, Secretary sub)
{
this.name = name;
this.sub = sub;
}
public abstract void Update();
}
//看股票的同事
class StockObserver : Observer
{
public StockObserver(string name, Secretary sub) : base(name, sub)
{
}
public override void Update()
{
Console.WriteLine("{0} {1} 關閉股票行情,繼續工作!", sub.SecretaryAction, name);
}
}
//看NBA的同事
class NBAObserver : Observer
{
public NBAObserver(string name, Secretary sub) : base(name, sub)
{
}
public override void Update()
{
Console.WriteLine("{0} {1} 關閉NBA直播,繼續工作!", sub.SecretaryAction, name);
}
}
static void Main(string[] args)
{
//老闆胡漢三
Boss huhansan = new Boss();
//看股票的同事
StockObserver tongshi1 = new StockObserver("魏關奼", huhansan);
//看NBA的同事
NBAObserver tongshi2 = new NBAObserver("易管查", huhansan);
huhansan.Attach(tongshi1);
huhansan.Attach(tongshi2);
huhansan.Detach(tongshi1);
//老闆回來
huhansan.SubjectState = "我胡漢三回來了!";
//發出通知
huhansan.Notify();
Console.Read();
}
實際過程中,使用者介面可以作為一個觀察者(可以有多個),業務資料可以是通知者(可以有多個),使用者介面觀察業務資料的變化,當發現資料變化時,就顯示在介面上
相關文章
- 觀察者模式-訂閱釋出模式模式
- js 觀察者模式 訂閱釋出模式JS模式
- 觀察者模式 vs 釋出訂閱模式模式
- 觀察者模式 vs 釋出-訂閱模式模式
- 釋出訂閱 VS 觀察者模式模式
- JavaScript 觀察者 (釋出/訂閱) 模式JavaScript模式
- 觀察者模式和釋出訂閱模式(上)模式
- 談談觀察者模式和釋出訂閱模式模式
- javascript(js) 觀察者模式和釋出訂閱模式JavaScriptJS模式
- JavaScript設計模式 觀察者模式(釋出訂閱)JavaScript設計模式
- 觀察者模式與釋出訂閱模式區別 - JS模式JS
- 設計模式(三)觀察者模式Observer(釋出訂閱)設計模式Server
- JavaScript 設計模式之觀察者模式與釋出訂閱模式JavaScript設計模式
- 理解javascript觀察者模式(訂閱者與釋出者)JavaScript模式
- 設計模式學習之觀察者模式和釋出訂閱模式設計模式
- JavaScript設計模式之釋出-訂閱模式(觀察者模式)-Part2JavaScript設計模式
- 淺談觀察者模式和釋出訂閱者模式的微妙區別模式
- 對於觀察者模式和釋出者-訂閱者模式的一些理解模式
- SpringBoot事件監聽機制及觀察者模式/釋出訂閱模式Spring Boot事件模式
- 設計模式之釋出訂閱模式(2) Redis 釋出/訂閱模式設計模式Redis
- 釋出-訂閱模式模式
- 釋出訂閱模式模式
- 不好意思,觀察者模式跟釋出訂閱模式就是不一樣模式
- 【10分鐘帶你瞭解釋出訂閱和觀察者模式】模式
- 對釋出-訂閱者模式的解析模式
- 非父子元件之間傳值(Bus/匯流排/釋出訂閱模式/觀察者模式)元件模式
- 設計模式之釋出訂閱模式(1) 一文搞懂釋出訂閱模式設計模式
- JS訂閱釋出模式JS模式
- ActiveMQ釋出訂閱模式MQ模式
- js設計模式--釋出訂閱模式JS設計模式
- Javascript(七)釋出-訂閱模式JavaScript模式
- 釋出訂閱模式學習模式
- 5分鐘通過一個例子理解觀察者模式和釋出訂閱模式的區別模式
- JavaScript設計模式系列--釋出訂閱模式JavaScript設計模式
- JS設計模式七:釋出-訂閱模式JS設計模式
- Javascript設計模式之釋出-訂閱模式JavaScript設計模式
- 設計模式之單例、工廠、釋出訂閱者模式設計模式設計模式單例
- 重構與模式(二)——釋出訂閱模式與中介者模式實際使用模式