小菜学设计模式——观察者模式
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
背景? ?
????上一次去看電影院看電影,半旁邊的妹子說(shuō)只要掃一掃就能免費(fèi)領(lǐng)取爆米花一份,你說(shuō)我怎么躲得過(guò)妹子的招數(shù)呢?所以拿起我的手機(jī),掃一掃,注冊(cè)會(huì)員,ok 領(lǐng)取爆米花。時(shí)間過(guò)去了,我發(fā)現(xiàn)我的手機(jī)怎么老是收到一些亂七八糟的信息,一旦有什么大小事我都會(huì)收到信息,你可知道我是拒絕的。恩,這里就說(shuō)說(shuō),觀察者模式,因?yàn)槲业氖謾C(jī)號(hào)碼已經(jīng)成為他們發(fā)消息的接收者,或說(shuō)監(jiān)聽(tīng)器、或說(shuō)觀察者。
1、使用意圖? ?
????當(dāng)一個(gè)對(duì)象改變的同時(shí)需要改變其他對(duì)象時(shí),觀察者模式似乎很受用。
2、生活實(shí)例? ?
????飯點(diǎn)一到,所有同事包括我立刻放下手中的活,有看NBA的、有睡覺(jué)的,有直接去食堂排隊(duì)等飯吃的。似乎這里少了一個(gè)通知的過(guò)程,呵呵,不要緊。
3、Java 例子(框架、JDK 、JEE)
? ? 因?yàn)橛^察者的本質(zhì)就是監(jiān)聽(tīng)器,所以使用監(jiān)聽(tīng)器最多的當(dāng)然是Swing或AWT,比如一個(gè)按鈕被點(diǎn)擊會(huì)觸發(fā)click事件,鼠標(biāo)移動(dòng)會(huì)觸發(fā)mouseover事件等,事件觸發(fā),就會(huì)通知對(duì)應(yīng)觀察者(監(jiān)聽(tīng)器)
4、模式類圖? ??
抽象主題角色(Subject):定義一個(gè)接口,聲明作為主題角色應(yīng)該具備的方法(對(duì)觀察者對(duì)象的增刪改之類的方法聲明)。
主題角色(Concrete Subject):實(shí)現(xiàn)了抽象主題角色,實(shí)現(xiàn)了它的所有方法,并且含有一個(gè)抽象觀察者角色的集合引用作為成員變量,也就是說(shuō)一個(gè)主題角色可以擁有多個(gè)觀察者。
抽象觀察者角色(Observer):定義了一個(gè)接口,聲明最為觀察者角色應(yīng)該具備的方法(這個(gè)方法是當(dāng)觀察者收到通知后做出的反應(yīng),一般就是update)。
具體觀察者角色(Concrete Observer):實(shí)現(xiàn)抽象觀察者角色,主要是實(shí)現(xiàn)接口中的update方法。
5、模式優(yōu)點(diǎn)
? 觀察者模式:定義了一種一對(duì)多的依賴關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽(tīng)某一個(gè)主題對(duì)象,這個(gè)主題對(duì)象在狀態(tài)發(fā)生變化時(shí),會(huì)通知所有觀察者對(duì)象,是他們能夠自動(dòng)更新自己。(也叫做 發(fā)布-訂閱模式)? ? 觀察者所做的工作其實(shí)就是解除耦合,讓耦合的雙方都依賴于抽象,而不是依賴于具體。從而使得各自的變化都不會(huì)影響另一邊的變化。
6、與類似模式比較
? 觀察者模式是我們最常使用的設(shè)計(jì)模式之一,尤其是jQuery前端時(shí),對(duì)于事件的注冊(cè)都是觀察者模式的一個(gè)淋漓盡致的體現(xiàn)。? ? 觀察者和其他模式的比較,感覺(jué)差距很大。
轉(zhuǎn)載于:https://my.oschina.net/heweipo/blog/466249
總結(jié)
以上是生活随笔為你收集整理的小菜学设计模式——观察者模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: oslo.config资源
- 下一篇: WPF中设置了WindowStyle=N