![14-設(shè)計模式教學(xué)課件_第1頁](http://file4.renrendoc.com/view/9e1f5a1a68ad38df9d255edb2b1866e0/9e1f5a1a68ad38df9d255edb2b1866e01.gif)
![14-設(shè)計模式教學(xué)課件_第2頁](http://file4.renrendoc.com/view/9e1f5a1a68ad38df9d255edb2b1866e0/9e1f5a1a68ad38df9d255edb2b1866e02.gif)
![14-設(shè)計模式教學(xué)課件_第3頁](http://file4.renrendoc.com/view/9e1f5a1a68ad38df9d255edb2b1866e0/9e1f5a1a68ad38df9d255edb2b1866e03.gif)
![14-設(shè)計模式教學(xué)課件_第4頁](http://file4.renrendoc.com/view/9e1f5a1a68ad38df9d255edb2b1866e0/9e1f5a1a68ad38df9d255edb2b1866e04.gif)
![14-設(shè)計模式教學(xué)課件_第5頁](http://file4.renrendoc.com/view/9e1f5a1a68ad38df9d255edb2b1866e0/9e1f5a1a68ad38df9d255edb2b1866e05.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、觀察者(Observer)模式 課本例子辦公時間做與工作無關(guān)的事情在老板到來時,前臺負(fù)責(zé)通知好友進(jìn)入工作狀態(tài)注意開放-封閉原則,依賴倒轉(zhuǎn)原則,降低耦合性。通知者接口interface Subject void Attach(Observer observer); void Detach(Observer observer); void Notify(); string SubjectState get; set; class Secretary : Subject /同事列表 private IList observers = new List(); private string action
2、; /增加 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(); /前臺狀態(tài) public string SubjectState get return action; set action = value; 抽象觀察者abstract clas
3、s Observer protected string name; protected Subject sub; public Observer(string name, Subject sub) = name; this.sub = sub; public abstract void Update(); 看股票的同事class StockObserver : Observer public StockObserver(string name, Subject sub) : base(name, sub) public override void Update() Cons
4、ole.WriteLine(0 1 關(guān)閉股票行情,繼續(xù)工作!, sub.SubjectState, name); 看NBA的同事 class NBAObserver : Observer public NBAObserver(string name, Subject sub) : base(name, sub) public override void Update() Console.WriteLine(0 1 關(guān)閉NBA直播,繼續(xù)工作!, sub.SubjectState, name); 客戶端class Program static void Main(string args) Secr
5、etary tongzizhe = new Secretary(); StockObserver tongshi1 = new StockObserver(魏關(guān)姹, tongzizhe); NBAObserver tongshi2 = new NBAObserver(易管查, tongzizhe); tongzizhe.Attach(tongshi1); tongzizhe.Attach(tongshi2); tongzizhe.SecretaryState = 老板回來了!; tongzizhe.Notify(); Console.Read(); 觀察者模式又叫做:發(fā)布-訂閱(Publish
6、/Subscribe)模式模型-視圖(Model/View)模式源-監(jiān)聽器(Source/Listener)模式從屬者(Dependents)模式。觀察者模式定義了一種一對多的依賴關(guān)系,讓多個觀察者對象同時監(jiān)聽某一個主題對象。這個主題對象在狀態(tài)上發(fā)生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。一個軟件系統(tǒng)常常要求在某一個對象的狀態(tài)發(fā)生變化的時候,某些其它的對象做出相應(yīng)的改變。做到這一點(diǎn)的設(shè)計方案有很多,但是為了使系統(tǒng)能夠易于復(fù)用,應(yīng)該選擇低耦合度的設(shè)計方案。減少對象之間的耦合有利于系統(tǒng)的復(fù)用,但是同時設(shè)計師需要使這些低耦合度的對象之間能夠維持行動的協(xié)調(diào)一致,保證高度的協(xié)作(Colla
7、boration)。觀察者模式是滿足這一要求的各種設(shè)計方案中最重要的一種。觀察者模式的結(jié)構(gòu) 抽象主題(Subject)角色:一個目標(biāo)可以被多個觀察者觀察目標(biāo)提供對觀察者注冊和退訂的維護(hù)當(dāng)目標(biāo)的狀態(tài)發(fā)生變化時,目標(biāo)負(fù)責(zé)通知所有注冊的、有效地觀察者抽象觀察者(Observer)角色:為所有的具體觀察者定義一個接口,在得到主題的通知時更新自己。這個接口叫做更新接口。抽象觀察者角色一般用一個抽象類或者一個接口實(shí)現(xiàn)。在這個示意性的實(shí)現(xiàn)中,更新接口只包含一個方法(即Update()方法),這個方法叫做更新方法。 具體主題(ConcreteSubject)角色:將有關(guān)狀態(tài)存入具體現(xiàn)察者對象;在具體主題的內(nèi)部
8、狀態(tài)改變時,給所有登記過的觀察者發(fā)出通知。具體主題角色又叫做具體被觀察者角色(Concrete Observable)。具體主題角色通常用一個具體子類實(shí)現(xiàn)。 具體觀察者(ConcreteObserver)角色:具體現(xiàn)察者角色實(shí)現(xiàn)抽象觀察者角色所要求的更新接口,以便使本身的狀態(tài)與主題的狀態(tài)相協(xié)調(diào)。如果需要,具體現(xiàn)察者角色可以保存一個指向具體主題對象的引用。具體觀察者角色通常用一個具體子類實(shí)現(xiàn)。 認(rèn)識觀察者模式目標(biāo)和觀察者之間的關(guān)系典型的一對多的關(guān)系單向依賴觀察者依賴于目標(biāo)觸發(fā)通知的時機(jī)完成了狀態(tài)維護(hù)后觸發(fā)相互觀察A、B觀察C,B、C觀察A(兩套觀察模式)注意死循環(huán)通知的順序絕對不要依賴于通知的順
9、序,多個觀察者之間的功能是平行的,相互不應(yīng)該有先后的依賴關(guān)系觀察者模式的效果有以下幾個優(yōu)點(diǎn):觀察者模式實(shí)現(xiàn)了觀察者和目標(biāo)之間的抽象耦合。觀察者模式實(shí)現(xiàn)了動態(tài)聯(lián)動觀察者模式支持廣播通信。被觀察者會向所有的登記過的觀察者發(fā)出通知。 缺點(diǎn)可能會引起無謂的操作。由于采用廣播方式,不管觀察者需不需要,每個觀察者都會被調(diào)用update方法本質(zhì)觸發(fā)聯(lián)動一個實(shí)際應(yīng)用觀察者模式的例子 該例子演示了注冊的投資者在股票市場發(fā)生變化時,可以自動得到通知 /SubjectabstractclassStock/Fieldsprotectedstringsymbol;protecteddoubleprice;private
10、ArrayListinvestors=newArrayList();/ConstructorpublicStock(stringsymbol,doubleprice)this.symbol=symbol;this.price=price;/MethodspublicvoidAttach(Investorinvestor)investors.Add(investor);publicvoidDetach(Investorinvestor)investors.Remove(investor);publicvoidNotify()foreach(Investoriininvestors)i.Updat
11、e(this);/PropertiespublicdoublePricegetreturnprice;setprice=value;Notify(); publicstringSymbolgetreturnsymbol;setsymbol=value;/ConcreteSubjectclassIBM:Stock/ConstructorpublicIBM(stringsymbol,doubleprice):base(symbol,price)/ObserverinterfaceIInvestor/MethodsvoidUpdate(Stockstock); /ConcreteObservercl
12、assInvestor:IInvestor/Fieldsprivatestringname;privatestringobserverState;privateStockstock;/ConstructorspublicInvestor(stringname)=name;/MethodspublicvoidUpdate(Stockstock)Console.WriteLine(Notifiedinvestor0of1schangeto2:C,name,stock.Symbol,stock.Price);/PropertiespublicStockStockgetreturns
13、tock;setstock=value;/ClientpublicclassObserverApppublicstaticvoidMain(stringargs)/CreateinvestorsInvestors=newInvestor(Sorros);Investorb=newInvestor(Berkshire);/CreateIBMstockandattachinvestorsIBMibm=newIBM(IBM,120.00);ibm.Attach(s);ibm.Attach(b);/Changeprice,whichnotifiesinvestorsibm.Price=120.10;i
14、bm.Price=121.00;ibm.Price=120.50;ibm.Price=120.75;Java中的觀察者模式j(luò)ava.util.Observable,實(shí)現(xiàn)了大部分我們需要的目標(biāo)的功能,還有一個接口Observer,其中定義了update方法,就是觀察者的接口。C#的Observer模式實(shí)際上在C#中實(shí)現(xiàn)Observer模式?jīng)]有這么辛苦,.NET中提供了Delegate與Event機(jī)制,我們可以利用這種機(jī)制簡化Observer模式 A.14 委托與事件委托是對函數(shù)的封裝,可以當(dāng)作給方法的特征指定一個名稱。而事件則是委托的一種特殊形式,當(dāng)發(fā)生有意義的事情時,事件對象處理通知過程。委托
15、對象用關(guān)鍵字delegate來聲明事件對象用event關(guān)鍵字聲明例:貓和老鼠class Cat private string name; public Cat(string name) = name; public delegate void CatShoutEventHandler(); public event CatShoutEventHandler CatShout; public void Shout() Console.WriteLine(喵,我是0., name); if (CatShout != null) CatShout(); class Mouse p
16、rivate string name; public Mouse(string name) = name; public void Run() Console.WriteLine(老貓來了,0快跑!, name); static void Main(string args) Cat cat = new Cat(Tom); Mouse mouse1 = new Mouse(Jerry); Mouse mouse2 = new Mouse(Jack);cat.CatShout += new Cat.CatShoutEventHandler(mouse1.Run);cat.Cat
17、Shout += new Cat.CatShoutEventHandler(mouse2.Run); cat.Shout(); Console.Read(); 實(shí)例化一個委托使用委托可以將多個方法綁定到同一個委托變量,當(dāng)調(diào)用此變量時(這里用“調(diào)用”這個詞,是因?yàn)榇俗兞看硪粋€方法),可以依次調(diào)用所有綁定的方法。 +=是增加委托實(shí)例對象的意思-=減少一個需要觸發(fā)事件時通知的對象思考:為什么此處委托及事件調(diào)用時都沒參數(shù)delegatevoidUpdateDelegate();/SubjectclassSubjectpubliceventUpdateDelegateUpdateHandler;/Me
18、thodspublicvoidAttach(UpdateDelegateud)UpdateHandler+=ud;publicvoidDetach(UpdateDelegateud)UpdateHandler-=ud;publicvoidNotify()if(UpdateHandler!=null)UpdateHandler();/ConcreteSubjectclassConcreteSubject:Subject/FieldsprivatestringsubjectState;/PropertiespublicstringSubjectStategetreturnsubjectState;
19、setsubjectState=value;/ConcreteObserverclassConcreteObserverprivatestringname;privatestringobserverState;privateConcreteSubjectsubject;publicConcreteObserver(ConcreteSubjectsubject,stringname)this.subject=subject;=name;publicvoidUpdate()observerState=subject.SubjectState;Console.WriteLine(O
20、bserver0snewstateis1,name,observerState);publicConcreteSubjectSubjectgetreturnsubject;setsubject=value;classAnotherObserver/MethodspublicvoidShow()Console.WriteLine(AnotherObservergotanNotification!);publicclassClientpublicstaticvoidMain(stringargs)ConcreteSubjects=newConcreteSubject();ConcreteObservero1=newConcreteObserver(s,1);ConcreteObservero2=newConcreteObserver(s,2);AnotherObservero3=newAnotherObserver();s.Attach(newUpdateDelegate(o1.Update);s.Attach(newUpdateDelegate(o2.Update);s.Attach(newUpdateDelegate(o3.Show);s.SubjectState=ABC;s.Notify();Console.WriteLine
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年全球及中國乘用車用輕型柴油發(fā)動機(jī)行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025年全球及中國800G 數(shù)據(jù)中心交換機(jī)行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025-2030全球電動汽車電子軸行業(yè)調(diào)研及趨勢分析報告
- 2025-2030全球高架軌道秤行業(yè)調(diào)研及趨勢分析報告
- 2025打工人發(fā)財游園年會(打工人發(fā)財年會主題)活動策劃方案
- 建筑節(jié)能的規(guī)劃與實(shí)施策略
- 健身休閑行業(yè)服務(wù)交易合同范文
- 會計勞動合同模板
- 掌握數(shù)據(jù)分析的關(guān)鍵技能
- 石材幕墻施工合同范本
- 2025年中國高價HPV疫苗行業(yè)競爭格局分析及投資規(guī)劃研究報告
- 2025年春新北師大版物理八年級下冊課件 第七章 運(yùn)動和力 第四節(jié) 同一直線上二力的合成
- 《肝硬化的臨床表現(xiàn)》課件
- 新增值稅法學(xué)習(xí)課件
- 飛書項(xiàng)目管理
- 醫(yī)院醫(yī)共體2025年度工作計劃
- 2022年云上貴州大數(shù)據(jù)(集團(tuán))有限公司招聘筆試試題及答案解析
- 《工程測試技術(shù)》全套教學(xué)課件
- 自卸車司機(jī)實(shí)操培訓(xùn)考核表
- 教師個人基本信息登記表
- 中考現(xiàn)代文閱讀理解題精選及答案共20篇
評論
0/150
提交評論