Stragety State 責(zé)任鏈模式

策略模式

使用場(chǎng)景:

1.針對(duì)同一類型問題的多種處理方式,僅僅是具體行為有差別時(shí)

2.需要安全的封裝多種同一類型的操作時(shí)

3.出現(xiàn)同一抽象類有多個(gè)子類,而又需要使用if-else或者switch-case來選擇具體子類時(shí)


策略模式主要用來分離算法,在相同的行為抽象下有不同的具體實(shí)現(xiàn)策略。這個(gè)模式很好的演示了開閉原則,也就是定義抽象,注入不同的實(shí)現(xiàn),從而達(dá)到很好的擴(kuò)展性。

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

結(jié)構(gòu)清晰明了,使用簡(jiǎn)單直觀

耦合度相對(duì)而言較低,擴(kuò)展方便

操作封裝也更為徹底,數(shù)據(jù)更為安全。

缺點(diǎn): 隨著策略的增加,子類也會(huì)變得繁多。

狀態(tài)模式

使用場(chǎng)景:

1.一個(gè)對(duì)象的行為取決于他的狀態(tài),并且他必須在運(yùn)行時(shí)根絕狀態(tài)改變他的行為

2.代碼中包含大量域?qū)ο鬆顟B(tài)有關(guān)的條件語句。例如,一個(gè)操作中包含有龐大的多分支語句(if-else或者switch-case),且這些分支依賴于該對(duì)象的狀態(tài)。


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

State模式將所有與一個(gè)特定的和狀態(tài)相關(guān)的行為都放入一個(gè)狀態(tài)對(duì)象中,提供了一個(gè)更好的方法來組織與特定狀態(tài)相關(guān)的代碼,將繁瑣的狀態(tài)判斷轉(zhuǎn)化成結(jié)構(gòu)清晰的轉(zhuǎn)臺(tái)類族,在避免代碼膨脹的同時(shí)也保證了可擴(kuò)展性與可維護(hù)性。

缺點(diǎn):

狀態(tài)模式的使用必然會(huì)增加系統(tǒng)類型和對(duì)象的個(gè)數(shù)。

責(zé)任鏈模式

多個(gè)對(duì)象可以處理同一個(gè)請(qǐng)求,但具體由哪個(gè)對(duì)象處理則在運(yùn)行時(shí)動(dòng)態(tài)決定。

在請(qǐng)求處理者不明確的情況下向多個(gè)對(duì)象中的一個(gè)提交一個(gè)請(qǐng)求。

需要?jiǎng)討B(tài)指定一組對(duì)象處理請(qǐng)求


有點(diǎn):可以對(duì)請(qǐng)求者和處理者關(guān)系解耦,提高代碼靈活性

缺點(diǎn):對(duì)鏈中請(qǐng)求處理者的遍歷,如果是處理者太多那么遍歷必定會(huì)影響性能,特別是在一些遞歸調(diào)用中,要慎用。

解釋器模式

使用場(chǎng)景:

1.如果某個(gè)簡(jiǎn)單的語言需要解釋執(zhí)行而且可以將改語言中的語句表示為一個(gè)抽象語法樹時(shí)可以考慮使用解釋器模式。

2.在某些特定的領(lǐng)域出現(xiàn)不斷重復(fù)的問題時(shí),可以將該領(lǐng)域的問題轉(zhuǎn)化為一種語法規(guī)則下的語句,然后構(gòu)建解釋器來解釋該語句。


優(yōu)點(diǎn):靈活的擴(kuò)展性。當(dāng)我們想對(duì)文法規(guī)則進(jìn)行擴(kuò)展延伸時(shí),只需要增加相應(yīng)的非終結(jié)解釋器,并在構(gòu)建抽象語法樹時(shí),使用到新增的解釋器對(duì)象進(jìn)行具體的解釋即可。

缺點(diǎn):對(duì)于每一條文法都可以對(duì)應(yīng)至少一個(gè)解釋器,其會(huì)生成大量的類,導(dǎo)致后期維護(hù)困難;同時(shí)對(duì)于過于復(fù)雜的文法,構(gòu)建其抽象語法樹會(huì)顯得異常繁瑣,甚至有可能會(huì)出現(xiàn)需要構(gòu)建多棵抽象語法樹的情況,因此,對(duì)于復(fù)雜的文法并不推薦使用解釋器模式。

命令模式


觀察者模式

observe ?obserable

BroadcaseReceiver ?EventBus ?等都是觀察者模式

有點(diǎn):

1、觀察者與被觀察者之間是抽象耦合,應(yīng)對(duì)業(yè)務(wù)變化

2、增強(qiáng)系統(tǒng)靈活性、可擴(kuò)展性

缺點(diǎn):在應(yīng)用觀察者模式時(shí)需要考慮一下開發(fā)效率和運(yùn)行效率問題,程序中包括一個(gè)被觀察者、多個(gè)觀察者、開發(fā)和調(diào)試等內(nèi)容會(huì)比較復(fù)雜,而且在Java中消息的通知默認(rèn)是順序執(zhí)行的,一個(gè)觀察者卡頓會(huì)影響整體的執(zhí)行效率,在這種情況下一般考慮采用異步的形式。

備忘錄模式

使用場(chǎng)景:

需要保存一個(gè)對(duì)象在某一個(gè)時(shí)刻的狀態(tài)或部分狀態(tài)。

如果用一個(gè)接口來讓其他對(duì)象得到這些狀態(tài),將會(huì)暴露對(duì)象的實(shí)現(xiàn)細(xì)節(jié)并破壞對(duì)象的封裝性,一個(gè)對(duì)象不希望外界直接訪問其內(nèi)狀態(tài),通過間接對(duì)象可以間接訪問其內(nèi)部狀態(tài)。

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

給用戶提供了一種可以恢復(fù)狀態(tài)的機(jī)制,可以使用戶比較方便的回到某個(gè)歷史的狀態(tài)。

實(shí)現(xiàn)了信息的封裝,使得用戶不需要關(guān)心狀態(tài)的保存細(xì)節(jié)。

缺點(diǎn):消耗資源,如果類的成員變量過多,勢(shì)必會(huì)占用比較大的資源,而且每一次的保存都會(huì)消耗一定的內(nèi)存。



迭代器模式

使用場(chǎng)景:遍歷一個(gè)容器對(duì)象時(shí)

優(yōu)點(diǎn):支持以不同的方式去遍歷一個(gè)容器對(duì)象,也可以有多個(gè)遍歷,弱化了容器類與遍歷算法之間的關(guān)系。

缺點(diǎn):類文件的增加。


模版方法模式

使用場(chǎng)景:

1.多個(gè)子類有公有的方法,并且邏輯基本相同

2.重要復(fù)雜的算法,可以把核心算法設(shè)計(jì)為模板方法,周邊的相關(guān)細(xì)節(jié)功能則由各個(gè)子類實(shí)現(xiàn)

3.重構(gòu)時(shí),模板方法模式是一個(gè)經(jīng)常使用的模式,把相同的代碼抽取到父類中,然后通過鉤子函數(shù)約束其行為。

final方法 防止算法框架被覆蓋

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

封裝不變部分,擴(kuò)展可變部分。提取公共部分代碼,便于維護(hù)。

缺點(diǎn):模板方法會(huì)帶來代碼閱讀的難度,會(huì)讓用戶覺得難以理解。



訪問者模式

使用場(chǎng)景:

對(duì)象結(jié)構(gòu)比較穩(wěn)定,但經(jīng)常需要在此對(duì)象結(jié)構(gòu)上定義新的操作。

需要對(duì)一個(gè)對(duì)象結(jié)構(gòu)中的對(duì)象進(jìn)行很多不同的并且不相關(guān)的操作,而需要避免這些操作污染這些對(duì)象的類,也不希望在增加新操作時(shí)修改這些類。


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

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

各角色職責(zé)分離,符合單一職責(zé)原則。具有優(yōu)秀的擴(kuò)展性。使得數(shù)據(jù)結(jié)構(gòu)和作用于結(jié)構(gòu)上的操作解耦,使得操作集合可以獨(dú)立變化。靈活性。

缺點(diǎn):

具體元素對(duì)訪問者公布細(xì)節(jié),違反了迪米特原則。具體元素變更時(shí)導(dǎo)致修改成本大。違反了依賴倒置原則,為了達(dá)到“區(qū)別對(duì)待”而依賴了具體類,沒有依賴抽象。

中介者模式

使用場(chǎng)景:

當(dāng)對(duì)象之間的交互操作很多且每個(gè)對(duì)象的行為操作都依賴彼此時(shí),為防止在修改一個(gè)對(duì)象的行為時(shí),同時(shí)涉及修改很多其他對(duì)象的行為,可采用中介者模式,來解決緊耦合問題。該模式將對(duì)象之間的多對(duì)多關(guān)系變成一對(duì)多關(guān)系,中介者對(duì)象將系統(tǒng)從網(wǎng)狀結(jié)構(gòu)變成以調(diào)停者為中心的星形結(jié)構(gòu),達(dá)到降低系統(tǒng)的復(fù)雜性,提高可擴(kuò)展性的作用。


代理模式

使用場(chǎng)景:當(dāng)無法或不想直接訪問某個(gè)對(duì)象或訪問某個(gè)對(duì)象存在困難時(shí)可以通過一個(gè)代理對(duì)象間接訪問,為了保證客戶端使用的透明性,委托對(duì)象與代理對(duì)象需要實(shí)現(xiàn)相同的接口。

靜態(tài)代理模式 動(dòng)態(tài)代理


組合模式

透明的組合模式 ?安全的組合模式

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

可以清楚的定義分層次的復(fù)雜對(duì)象,表示對(duì)象的全部或部分層次,它讓高層模塊忽略了層次的差異,方便對(duì)整個(gè)層次結(jié)構(gòu)進(jìn)行控制。

高層模塊可以一致的使用一個(gè)組合結(jié)構(gòu)或其中單個(gè)對(duì)象,不必關(guān)心處理的是單個(gè)對(duì)象還是整個(gè)組合結(jié)構(gòu),簡(jiǎn)化了高層模塊的代碼。

在組合模式中增加新的枝干構(gòu)件和葉子構(gòu)件都很方便,無需對(duì)現(xiàn)有類庫進(jìn)行修改,符合開閉原則。

組合模式為樹形結(jié)構(gòu)的面向?qū)ο髮?shí)現(xiàn)提供了一種靈活的解決方案,同伙葉子對(duì)象和枝干對(duì)象的遞歸組合,可以形成復(fù)雜的樹形結(jié)構(gòu),但對(duì)樹形結(jié)構(gòu)的控制卻非常簡(jiǎn)單。

缺點(diǎn):

在新增構(gòu)件時(shí)不好對(duì)枝中的構(gòu)件類型進(jìn)行限制,不能依賴類型系統(tǒng)來施加這些約束,因?yàn)樵诖蠖鄶?shù)情況下,他們都來自于相同的抽象層。此時(shí)必須實(shí)時(shí)進(jìn)行類型檢查來實(shí)現(xiàn),這個(gè)實(shí)現(xiàn)過程較為復(fù)雜。

適配器模式

系統(tǒng)需要使用現(xiàn)有的類,而此類的接口不符合系統(tǒng)的需要,即接口不兼容。

想要建立一個(gè)可以重復(fù)使用的類,用于與一些彼此之間沒有太大關(guān)聯(lián)的一些類,包括一些可能在將來引進(jìn)的類一起工作

類適配器模式 ?對(duì)象適配器模式

裝飾模式

需要透明且動(dòng)態(tài)的擴(kuò)展類的

裝飾模式是以對(duì)客戶端透明的方式擴(kuò)展對(duì)象的功能,是繼承關(guān)系的一個(gè)替代方案;而代理模式則是給一個(gè)對(duì)象提供一個(gè)代理對(duì)象,并由代理對(duì)象來控制對(duì)原有對(duì)象的引用。裝飾模式應(yīng)該為所裝飾的對(duì)象增強(qiáng)功能;代理模式對(duì)代理的對(duì)象施加控制,但不對(duì)對(duì)象本身的功能進(jìn)行增強(qiáng)。

享元模式

系統(tǒng)中存在大量的相似對(duì)象。 ?細(xì)粒度的對(duì)象都具備較接近的外部狀態(tài),而且內(nèi)部狀態(tài)與環(huán)境無關(guān),也就是說對(duì)象沒有特定身份。 需要緩沖池的場(chǎng)景。

外觀模式

橋接模式

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

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

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