摘要:細(xì)思不恐主旨在設(shè)計(jì)模式中,觀察者模式的主旨則是定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新。
簡(jiǎn)單說兩句
觀察者模式,是對(duì)象行為型模式中的一種,有的時(shí)候人們也叫他發(fā)布/訂閱模式。當(dāng)我們需要在一個(gè)對(duì)象狀態(tài)改變的時(shí)候通知到其它對(duì)象,這時(shí)候就可以考慮一下觀察者模式。
細(xì)思不恐主旨
在設(shè)計(jì)模式中,觀察者模式的主旨則是定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新。
解惑
在上面我們說到,有時(shí)觀察者模式也稱發(fā)布/訂閱模式,那到底有啥區(qū)別呢?其實(shí)發(fā)布訂閱模式是處于廣義上的觀察者模式,因?yàn)樗亲畛S玫囊环N觀察者模式的實(shí)現(xiàn)。
發(fā)布訂閱模式相對(duì)觀察者多了一個(gè)事件的通道,因?yàn)樵谟^察者模式中,觀察者(Observer)需要直接訂閱目標(biāo)(Subject)事件,在目標(biāo)發(fā)出內(nèi)容更改事件時(shí),直接接收內(nèi)容事件并做出響應(yīng)。在發(fā)布訂閱模式中訂閱者需要從時(shí)間的通道中訂閱事件,這樣從發(fā)布者接收事件以及向訂閱者發(fā)布事件,兩者并沒有產(chǎn)生依賴的關(guān)系。
具體代碼上的區(qū)別,有興趣的朋友可以在下方留言,下次可以出一個(gè)小分支。
實(shí)現(xiàn)方式
在上面的介紹中,我們大概知道了在觀察者模式中,有這么兩種主角色:
Subject(被觀察者)
被觀察者必須要有添加觀察者、刪除觀察者和提醒觀察者的方法。
Observer(觀察者)
觀察者要有更新方法,用來做出響應(yīng)在狀態(tài)改變調(diào)用提醒方法后。
Java中已經(jīng)提供了觀察者模式的實(shí)現(xiàn),我們不需要再定義觀察者和目標(biāo)接口(被觀察者),也不需要維護(hù)觀察者的注冊(cè)信息??梢岳^承Observable類實(shí)現(xiàn)被觀察者目標(biāo)對(duì)象,實(shí)現(xiàn)Observer接口完成具體的觀察者對(duì)象,其中提供了update方法獲取相應(yīng)事件信息。
在這里為了方便說明觀察者的基本原理,自己實(shí)現(xiàn)一個(gè)簡(jiǎn)單的案例。
首先抽象一個(gè)觀察者類,里面有一個(gè)抽象方法更新狀態(tài)。
public abstract class Oberver{ public abstract void Update(); }
然后再寫一個(gè)抽象被觀察者類。
public abstract class Subject{ //增加 public abstract void Attach(Observer observer); //移除 public abstract void Detach(Observer observer); //通知 public abstract void Notify(); }
具體上面兩個(gè)類:
//具體的觀察者 public class ConcreteObserver extends Observer{ @Override public void Update() { System.out.println("狀態(tài)改變,更新狀態(tài)"); } } //具體被觀察者類 public class ConcreteSubject extends Subject { //定義集合存儲(chǔ)觀察者 Listlist=new ArrayList (); //增加觀察者 @Override public void Attach(Observer observer) { list.add(observer); } @Override public void Detach(Observer observer) { list.add(observer); } @Override public void Notify() { //遍歷集合觀察者對(duì)象 for(Observer observer:list){ observer.Update(); } } }
接下來我們就可以寫測(cè)試類了:
public class ObserverDemo { public static void main(String[] args) { //創(chuàng)建被觀察者對(duì)象 ConcreteSubject csb=new ConcreteSubject(); //創(chuàng)建觀察者對(duì)象 ConcreteObserver cob=new ConcreteObserver(); //將觀察者添加到被觀察者的通知名單內(nèi) csb.Attach(cob); //被觀察者發(fā)出通知,觀察者接受通知更新狀態(tài) csb.Notify(); } } //輸出 “狀態(tài)改變,更新狀態(tài)”
就這樣,一個(gè)簡(jiǎn)單的觀察者模式的案例就結(jié)束了。當(dāng)然一個(gè)復(fù)雜的應(yīng)用中,我們肯定需要一個(gè)完整而且適用與多線程以及異步系統(tǒng),因?yàn)橛^察者模式大都應(yīng)用與這兩中系統(tǒng),所以也需要考慮線程安全的問題。下次會(huì)介紹更加詳細(xì)完整的觀察者的實(shí)現(xiàn)方式。
寫在最后因?yàn)槊恳黄钠灰诉^長(zhǎng),所以本打字員盡量在精簡(jiǎn)自己所寫的內(nèi)容,盡量能夠多容擴(kuò)一些知識(shí)點(diǎn),但是具體的知識(shí)橫向擴(kuò)展可能就有一點(diǎn)欠缺,這也算是對(duì)自己的一種鍛煉,希望大家能夠一起進(jìn)步,怎么樣,在下面留個(gè)言吐槽一下本渣渣吧。(逃
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/68859.html
摘要:關(guān)鍵概念理解觀察者設(shè)計(jì)模式中主要區(qū)分兩個(gè)概念觀察者指觀察者對(duì)象,也就是消息的訂閱者被觀察者指要觀察的目標(biāo)對(duì)象,也就是消息的發(fā)布者。 原文首發(fā)于微信公眾號(hào):jzman-blog,歡迎關(guān)注交流! 最近補(bǔ)一下設(shè)計(jì)模式相關(guān)的知識(shí),關(guān)于觀察者設(shè)計(jì)模式主要從以下幾個(gè)方面來學(xué)習(xí),具體如下: 什么是觀察者設(shè)計(jì)模式 關(guān)鍵概念理解 通知觀察者的方式 觀察者模式的實(shí)現(xiàn) 觀察者模式的優(yōu)缺點(diǎn) 使用場(chǎng)景 下面...
摘要:觀察者模式與發(fā)布訂閱的區(qū)別在模式中,知道,同時(shí)還保留了的記錄。發(fā)布者訂閱者在大多情況下是異步方式使用消息隊(duì)列。圖片源于網(wǎng)絡(luò)侵權(quán)必刪如果以結(jié)構(gòu)來分辨模式,發(fā)布訂閱模式相比觀察者模式多了一個(gè)中間件訂閱器,所以發(fā)布訂閱模式是不同于觀察者模式的。 學(xué)習(xí)了一段時(shí)間設(shè)計(jì)模式,當(dāng)學(xué)到觀察者模式和發(fā)布訂閱模式的時(shí)候遇到了很大的問題,這兩個(gè)模式有點(diǎn)類似,有點(diǎn)傻傻分不清楚,博客起因如此,開始對(duì)觀察者和發(fā)布...
摘要:總結(jié)一下從表面上看觀察者模式里,只有兩個(gè)角色觀察者被觀察者而發(fā)布訂閱模式,卻不僅僅只有發(fā)布者和訂閱者兩個(gè)角色,還有第三個(gè)角色經(jīng)紀(jì)人存在。參考鏈接觀察者模式發(fā)布訂閱模式 做了這么長(zhǎng)時(shí)間的 菜鳥程序員 ,我好像還沒有寫過一篇關(guān)于設(shè)計(jì)模式的博客...咳咳...意外,純屬意外。所以,我決定,從這一刻起,我要把設(shè)計(jì)模式在從頭學(xué)習(xí)一遍,不然都對(duì)不起我這 菜鳥 的身份。那這次,就從觀察者模式開始好啦...
摘要:總結(jié)一下從表面上看觀察者模式里,只有兩個(gè)角色觀察者被觀察者而發(fā)布訂閱模式,卻不僅僅只有發(fā)布者和訂閱者兩個(gè)角色,還有第三個(gè)角色經(jīng)紀(jì)人存在。參考鏈接觀察者模式發(fā)布訂閱模式 做了這么長(zhǎng)時(shí)間的 菜鳥程序員 ,我好像還沒有寫過一篇關(guān)于設(shè)計(jì)模式的博客...咳咳...意外,純屬意外。所以,我決定,從這一刻起,我要把設(shè)計(jì)模式在從頭學(xué)習(xí)一遍,不然都對(duì)不起我這 菜鳥 的身份。那這次,就從觀察者模式開始好啦...
摘要:或許以前認(rèn)為訂閱發(fā)布模式是觀察者模式的一種別稱,但是發(fā)展至今,概念已經(jīng)有了不少區(qū)別。參考文章訂閱發(fā)布模式和觀察者模式真的不一樣 首選我們需要先了解兩者的定義和實(shí)現(xiàn)的方式,才能更好的區(qū)分兩者的不同點(diǎn)。 或許以前認(rèn)為訂閱發(fā)布模式是觀察者模式的一種別稱,但是發(fā)展至今,概念已經(jīng)有了不少區(qū)別。 訂閱發(fā)布模式 在軟件架構(gòu)中,發(fā)布-訂閱是一種消息范式,消息的發(fā)送者(稱為發(fā)布者)不會(huì)將消息直接發(fā)送給特...
摘要:為了幫助灰太狼擺脫被老婆平底鍋抽的悲劇,發(fā)起了解救灰太狼的行動(dòng),必須要知道觀察者模式。持有觀察者對(duì)象的集合。設(shè)計(jì)模式源碼下載 相信大家都有看過《喜洋洋與灰太狼》,說的是灰太狼和羊族的斗爭(zhēng),而每次的結(jié)果都是灰太狼一飛沖天,伴隨著一句我還會(huì)回來的......。為灰太狼感到悲哀,抓不到羊,在家也被老婆平底鍋虐待?;姨菫槭裁磿?huì)這么背? 很簡(jiǎn)單,灰太狼本身就有暴露行蹤的屬性,羊咩咩就能知曉灰太...
閱讀 3504·2023-04-26 02:44
閱讀 1635·2021-11-25 09:43
閱讀 1529·2021-11-08 13:27
閱讀 1893·2021-09-09 09:33
閱讀 908·2019-08-30 15:53
閱讀 1772·2019-08-30 15:53
閱讀 2781·2019-08-30 15:53
閱讀 3115·2019-08-30 15:44