2018-07-18

觀察者模式

圖示

image.png

涉及角色

  • 抽象主題(Subject)角色:抽象主題角色把所有對觀察者對象的引用保存在一個聚集(比如ArrayList對象)里,每個主題都可以有任何數(shù)量的觀察者。抽象主題提供一個接口,可以增加和刪除觀察者對象,抽象主題角色又叫做抽象被觀察者(Observable)角色。

  • 具體主題(ConcreteSubject)角色:將有關(guān)狀態(tài)存入具體觀察者對象;在具體主題的內(nèi)部狀態(tài)改變時,給所有登記過的觀察者發(fā)出通知。具體主題角色又叫做具體被觀察者(Concrete Observable)角色。

  • 抽象觀察者(Observer)角色:為所有的具體觀察者定義一個接口,在得到主題的通知時更新自己,這個接口叫做更新接口。

  • 具體觀察者(ConcreteObserver)角色:存儲與主題的狀態(tài)自恰的狀態(tài)。具體觀察者角色實(shí)現(xiàn)抽象觀察者角色所要求的更新接口,以便使本身的狀態(tài)與主題的狀態(tài) 像協(xié)調(diào)。如果需要,具體觀察者角色可以保持一個指向具體主題對象的引用。

對于觀察者模式推送和拉取兩種模式的比較

  • 推送模式是假定主圖對象已經(jīng)知道觀察者需要的數(shù)據(jù),拉取模式是主題不知道觀察著需要什么數(shù)據(jù)就把自身素有屬性傳遞給觀察者,讓觀察者自己按需要取值

  • 推送模式可能會使觀察者難以復(fù)用,因?yàn)閡pdate方法的參數(shù)是找需要指定的類型,這就意味著每當(dāng)出現(xiàn)新的情況的時候,就需要提供新的update方法,或者重新實(shí)現(xiàn)一個觀察者;拉模型因?yàn)橹苯訉⒈旧韨鬟f給了觀察者,等同于將所有能傳遞的屬性集合傳遞給了觀察者,基本上可以適應(yīng)各種情況的需要

java中對于觀察者模式的支持

  • Java在java.util包里邊提供了一個observable類以及一個observe接口,構(gòu)成java語言對觀察者模式的支持

  • 在使用時,observable有一個子類watched(被觀察者),observer有一個子類watcher(觀察者)

擴(kuò)展

消息中間件相關(guān)知識

模式
發(fā)布訂閱模式
image.png
  • 基于訂閱的模式,一條消息能被多個服務(wù)街搜狐

  • 服務(wù)端只負(fù)責(zé)推送,不理會接收端的情況,單純的生產(chǎn)者

  • 聯(lián)想到的相關(guān)技術(shù)服務(wù):搜狐新聞rss訂閱

點(diǎn)對點(diǎn)模式
image.png
  • 一個消息只能被一個服務(wù)接收

  • 消息一旦被消費(fèi),就會消失

  • 如果沒有被消費(fèi),就會一直等待,直到被消費(fèi)

  • 多個服務(wù)監(jiān)聽同一個消費(fèi)空間,先到先得

請求-應(yīng)答模式
image.png
  • 基于點(diǎn)對點(diǎn)模式的擴(kuò)展,所以擁有點(diǎn)對點(diǎn)模式的相關(guān)特性

  • 責(zé)任轉(zhuǎn)移,由消費(fèi)者通知生產(chǎn)者推送消息,而不是生產(chǎn)者隨意發(fā)送

  • 避免資源浪費(fèi)

  • 安全性能提升

裝飾器模式

說明

裝飾模式能夠?qū)崿F(xiàn)動態(tài)的為對象添加功能,是從一個對象外部來給對象添加功能。通常給對象添加功能,要么直接修改對象添加相應(yīng)的功能,要么派生對應(yīng)的子類來擴(kuò)展,抑或是使用對象組合的方式。顯然,直接修改對應(yīng)的類這種方式并不可取。在面向?qū)ο蟮脑O(shè)計(jì)中,而我們也應(yīng)該盡量使用對象組合,而不是對象繼承來擴(kuò)展和復(fù)用功能。裝飾器模式就是基于對象組合的方式,可以很靈活的給對象添加所需要的功能。裝飾器模式的本質(zhì)就是動態(tài)組合。動態(tài)是手段,組合才是目的。總之,裝飾模式是通過把復(fù)雜的功能簡單化,分散化,然后再運(yùn)行期間,根據(jù)需要來動態(tài)組合的這樣一個模式。

對象的組合:一個類可以把對象作為自己的成員變量,如果用這樣的類創(chuàng)建對象,那么該對象中就會有其它對象,也就是說該對象將其他對象作為自己的組成部分(這就是人們常說的Has-A),或者說該對象是由幾個對象組合而成。

上面說的重點(diǎn)其實(shí)就是:

  • 復(fù)雜的功能簡單化

  • 按需動態(tài)組合

舉例

一輛車,品牌只能要么是奧迪、要么是寶馬,不可能同時屬于奧迪和寶馬,而品牌也是一輛車本身的重要屬性特征。但當(dāng)你想要給汽車噴漆,換坐墊,或者更換音響時,這些功能是互相可能兼容的,并且他們的存在不會影響車的核心屬性:那就是他是一輛什么車。這時你就可以定義一個裝飾器:噴了漆的車。不管他裝飾的車是寶馬還是奧迪,他的噴漆效果都可以實(shí)現(xiàn)。

圖示

image.png

涉及角色

  • 抽象組件:component 需要裝飾的抽象對象

  • 具體組件:comcreteComponent 需要裝飾的對象

  • 抽象裝飾類: decorator 內(nèi)含只想抽象組件的引用及裝飾者共有的方法

  • 具體裝飾類:concreteDecorator 被裝飾的對象

特點(diǎn)

  • 裝飾著和被裝飾者擁有共同的超類

  • 利用繼承獲得類型匹配

  • 利用組合擴(kuò)展行為

缺點(diǎn)

  • 會產(chǎn)生大量的小類

  • 實(shí)例化組件時,會增加代碼復(fù)雜度

Java中的應(yīng)用

項(xiàng)目思考

  • 經(jīng)營參謀中有組件的概念,當(dāng)組價組件的功能確定下來以后,后續(xù)為組件添加新的功能的時候:比如其他的屬性 字體size,字體顏色,樣式布局等等,直接去改變組價類顯然是不合適的,如果通過繼承來進(jìn)行擴(kuò)展可以滿足當(dāng)前需求,但是后續(xù)再增加屬性,難道繼續(xù)繼承?這樣下去會導(dǎo)致層次復(fù)雜,難以復(fù)用,使用裝飾器模式可以解決這種問題,不斷的新建裝飾器來滿足需求,雖然也會產(chǎn)生小類,但是層次簡單,動態(tài)組合

工廠模式(https://blog.csdn.net/zxt0601/article/details/52798423

簡單工廠

定義

在簡單工廠模式中,可以根據(jù)參數(shù)的不同返回不同類的實(shí)例。簡單工廠模式專門定義一個類來負(fù)責(zé)創(chuàng)建其他類的實(shí)例,被創(chuàng)建的實(shí)例通常都具有共同的父類。

簡單工廠模式的要點(diǎn)在于:當(dāng)你需要什么,只需要傳入一個正確的參數(shù),就可以獲取你所需要的對象,而無須知道其創(chuàng)建細(xì)節(jié)。

設(shè)計(jì)角色

Factory:工廠角色 工廠角色負(fù)責(zé)實(shí)現(xiàn)創(chuàng)建所有實(shí)例的內(nèi)部邏輯

Product:抽象產(chǎn)品角色 抽象產(chǎn)品角色是所創(chuàng)建的所有對象的父類,負(fù)責(zé)描述所有實(shí)例所共有的公共接口

ConcreteProduct:具體產(chǎn)品角色 具體產(chǎn)品角色是創(chuàng)建目標(biāo),所有創(chuàng)建的對象都充當(dāng)這個角色的某個具體類的實(shí)例。

特點(diǎn)

  • 工廠角色負(fù)責(zé)實(shí)現(xiàn)創(chuàng)建所有實(shí)例的內(nèi)部邏輯;

  • 抽象產(chǎn)品角色是所創(chuàng)建的所有對象的父類,負(fù)責(zé)描述所有實(shí)例所共有的公共接口;

  • 具體產(chǎn)品角色是創(chuàng)建目標(biāo),所有創(chuàng)建的對象都充當(dāng)這個角色的某個具體類的實(shí)例。

圖示

image.png

優(yōu)點(diǎn)

  • 實(shí)現(xiàn)對象的創(chuàng)建和對象的使用分離,將對象的創(chuàng)建交給專門的工廠類負(fù)責(zé),

缺點(diǎn)

  • 缺點(diǎn)在于工廠類不夠靈活,增加新的具體產(chǎn)品需要修改工廠類的判斷邏輯代碼,而且產(chǎn)品較多時,工廠方法代碼將會非常復(fù)雜

工廠模式

定義

工廠方法模式是簡單工廠模式的進(jìn)一步抽象和推廣。由于使用了面向?qū)ο蟮亩鄳B(tài)性,工廠方法模式保持了簡單工廠模式的優(yōu)點(diǎn),而且克服了它的缺點(diǎn)。在工廠方法模式中,核心的工廠類不再負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建工作交給子類去做。這個核心類僅僅負(fù)責(zé)給出具體工廠必須實(shí)現(xiàn)的接口,而不負(fù)責(zé)哪一個產(chǎn)品類被實(shí)例化這種細(xì)節(jié),這使得工廠方法模式可以允許系統(tǒng)在不修改工廠角色的情況下引進(jìn)新產(chǎn)品。

圖示

image.png

角色

  • 抽象產(chǎn)品是定義產(chǎn)品的接口,是工廠方法模式所創(chuàng)建對象的超類型,即產(chǎn)品對象的共同父類或接口;

  • 具體產(chǎn)品實(shí)現(xiàn)了抽象產(chǎn)品接口,某種類型的具體產(chǎn)品由專門的具體工廠創(chuàng)建,它們之間往往一一對應(yīng);

  • 抽象工廠中聲明了工廠方法,用于返回一個產(chǎn)品,它是工廠方法模式的核心,任何在模式中創(chuàng)建對象的工廠類都必須實(shí)現(xiàn)該接口;

  • 具體工廠是抽象工廠類的子類,實(shí)現(xiàn)了抽象工廠中定義的工廠方法,并可由客戶調(diào)用,返回一個具體產(chǎn)品類的實(shí)例。

優(yōu)點(diǎn)

  • 增加新的產(chǎn)品類時無須修改現(xiàn)有系統(tǒng),并封裝了產(chǎn)品對象的創(chuàng)建細(xì)節(jié),系統(tǒng)具有良好的靈活性和可擴(kuò)展性;

缺點(diǎn)

  • 其缺點(diǎn)在于增加新產(chǎn)品的同時需要增加新的工廠,導(dǎo)致系統(tǒng)類的個數(shù)成對增加,在一定程度上增加了系統(tǒng)的復(fù)雜性。

抽象工廠

定義

圖示

image.png

特點(diǎn)

  • 利用對象組合

  • 負(fù)責(zé)將客戶從具體類型中解耦

  • 把一群相關(guān)的產(chǎn)品集合起來

  • 經(jīng)常使用工廠方法模式來實(shí)現(xiàn)具體工廠

優(yōu)點(diǎn)

缺點(diǎn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 設(shè)計(jì)模式匯總 一、基礎(chǔ)知識 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用、多...
    MinoyJet閱讀 4,075評論 1 15
  • 這里是對《設(shè)計(jì)模式Java版》[https://gof.quanke.name]的提煉匯總,在真正深入理解之前,方...
    LeonXtp閱讀 1,156評論 0 0
  • 我的大腦患了風(fēng)濕 刮風(fēng)下雨日 腦神經(jīng)在咆哮 腦液在沸騰 細(xì)胞在尖叫 我的大腦患了風(fēng)濕 網(wǎng)絡(luò)會把我捕捉 用射線將其突...
    舟海落閱讀 415評論 3 4
  • 上一章|目錄 第五十八章 鳳九 白淺剛剛從中庭步入大殿,左前方的高大石柱后面便飛速竄出一團(tuán)火紅色的光影,一下子撞...
    娥媚閱讀 29,547評論 83 133
  • 一、設(shè)置導(dǎo)航欄背景全透明 -(void)viewWillAppear:(BOOL)animated{ //設(shè)置導(dǎo)...
    LHsunshine閱讀 439評論 0 1

友情鏈接更多精彩內(nèi)容