民初思韻網

加入收藏   設為首頁
選擇語言   簡體中文
你好,請 登陸 或 注冊
首頁 人文思韻 傳奇人物 歷史思潮 時代作品 話題討論 國民思韻 民初捐助 賬戶管理
  搜索  
    人文精神 >>> 技術的天空 溫和的思緒
字體    

C#面向對象設計模式縱橫談 第19講:Observer 觀察者模式
C#面向對象設計模式縱橫談 第19講:Observer 觀察者模式
MSDN 網絡廣播 李建忠     阅读简体中文版

2006.7.19 李建忠

發布-訂閱模型

image

當我們賬戶的金額有任何的操作,如果我們訂閱了服務,例如手機、Email等,那么我們都會得到通知。

 

動機(Motivation)

在軟件構建過程中,我們需要為某些對象建立一種“通知依賴關系”——一個對象(目標對象)的狀態發生改變,所有的依賴對象(觀察者對象)都將得到通知。如果這樣的依賴關系過于緊密,將使軟件不能很好地抵御變化。

使用面向對象技術,可以將這種依賴關系弱化,并形成一種穩定的依賴關系。從而實現軟件體系結構的松耦合。

 

意圖(Intent)

定義對象間的一種一對多的依賴關系,以便當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并自動更新

——《設計模式》GoF

 

例說Observer應用

image

image

這樣設計,如果還有其他設備需要通知,那么我們每次都需要頻繁地修改BankAccount。

 

改進的設計

image

image

image

image

image

 

結構(Structure)

image

ConcreteSubject對應例子中的BankAccount,ConcreteObserver對應Emailer、Mobile等。

 

Observer模式的幾個要點

使用面向對象的抽象,Observer模式使得我們可以獨立地改變目標與觀察者(面向對象中的改變不是指改代碼,而是指擴展、子類化、實現接口),從而使二者之間的依賴關系達致松耦合。

目標發送通知時,無需指定觀察者,通知(可以攜帶通知信息作為參數)會自動傳播。觀察者自己決定是否需要訂閱通知,目標對象對此一無所知。

在C#的event中,委托充當了抽象的Observer接口,而提供事件的對象充當了目標對象。委托是比抽象Observer接口更為松耦合的設計。

 

.NET框架中的Observer

image

image

AccountChange委托里面會遍歷所有的委托鏈表里面的對象然后調用。

image

Emailer這里雖然并沒有實現接口,但它其實隱含的約定了接口,它的方法名字可以不一定是Update,使得松耦合更加靈活。

image

委托的+號其實就是往委托鏈表里面Add通知的方法,委托事件把遍歷的方法和添加刪除方法都替我們做好了,但實現的原理還是和我們第一個例子一樣。

Emailer和BankAccount之間沒有強依賴,它們之間的依賴是靠第三方的委托依賴的,只要委托穩定,其它都會穩定。所以我們完全可以把委托看成一個接口,我們盡量要只依賴于委托,而不要讓委托來依賴我們具體的類型。

2010.10.19

2013-08-22 08:51

歡迎訂閱我們的微信公眾賬號!
春秋茶館訂閱號
微信號 season-tea(春秋茶館)
每天分享一篇科技/遊戲/人文類的資訊,點綴生活,啟迪思想,探討古典韻味。
  清末民初歷史人物  民初人物
傳奇人物傳記 風華絕代 物華天寶
此間選取古往今來傳奇人物的傳記與軼事,事不分大小,趣味為先,立意新穎,足以激越古今。
學貫中西品讀東西文化
林語堂(1895年10月10日-1976年3月26日),中國文學家、發明家。福建省龍溪(現為漳州市平和縣)坂仔鎮人,乳名和樂,名玉堂,後改為語堂。美國哈佛大學比較文學碩士....
資助民初精神網
        回頂部     寫評論

 
評論集
暫無評論!
發表評論歡迎你的評論
昵稱:     登陸  註冊
主頁:  
郵箱:  (僅管理員可見)

驗證:   验证码(不區分大小寫)  
© 2011   民初思韻網-清末民初傳奇時代的發現與復興   版權所有   加入收藏    設為首頁    聯繫我們    1616導航