觀察者模式
圖示

涉及角色
抽象主題(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)模式

一個消息只能被一個服務(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)。
圖示

涉及角色
抽象組件:component 需要裝飾的抽象對象
具體組件:comcreteComponent 需要裝飾的對象
抽象裝飾類: decorator 內(nèi)含只想抽象組件的引用及裝飾者共有的方法
具體裝飾類:concreteDecorator 被裝飾的對象
特點(diǎn)
裝飾著和被裝飾者擁有共同的超類
利用繼承獲得類型匹配
利用組合擴(kuò)展行為
缺點(diǎn)
會產(chǎn)生大量的小類
實(shí)例化組件時,會增加代碼復(fù)雜度
Java中的應(yīng)用
- javaio類 原文鏈接:https://blog.csdn.net/wxl1234579/article/details/52755967
image.png
項(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í)例。
圖示

優(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)品。
圖示

角色
抽象產(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ù)雜性。
抽象工廠
定義
圖示

特點(diǎn)
利用對象組合
負(fù)責(zé)將客戶從具體類型中解耦
把一群相關(guān)的產(chǎn)品集合起來
經(jīng)常使用工廠方法模式來實(shí)現(xiàn)具體工廠
