一、責(zé)任鏈模式(Chain of Responsibility Pattern)
意圖:創(chuàng)建一個(gè)處理請(qǐng)求的對(duì)象鏈,對(duì)象發(fā)送者和對(duì)象接受者解耦。責(zé)任鏈上的對(duì)象如果不能處理請(qǐng)求,就會(huì)把請(qǐng)求發(fā)送給下一個(gè)責(zé)任鏈節(jié)點(diǎn)。
實(shí)現(xiàn):
- 創(chuàng)建責(zé)任鏈節(jié)點(diǎn)的抽象類(lèi)
- 使用抽象類(lèi)生成若干處理節(jié)點(diǎn)
- 節(jié)點(diǎn)依次連接,保存下一個(gè)節(jié)點(diǎn)的地址
- 當(dāng)請(qǐng)求進(jìn)入時(shí)判斷是否是自己處理的類(lèi)型,不是傳給下一個(gè)節(jié)點(diǎn)。
- 請(qǐng)求發(fā)送給責(zé)任鏈頭節(jié)點(diǎn)即可
二、命令模式(Command Pattern)
意圖:將請(qǐng)求(可以是調(diào)用方法的請(qǐng)求)封裝成一個(gè)對(duì)象,再創(chuàng)建一個(gè)執(zhí)行類(lèi),可以向執(zhí)行類(lèi)中添加請(qǐng)求對(duì)象,然后再統(tǒng)一執(zhí)行。執(zhí)行前可以任意添加和刪除命令。過(guò)程有點(diǎn)類(lèi)似建造者模式,添加添加然后統(tǒng)一執(zhí)行。
實(shí)現(xiàn):
- 創(chuàng)建一個(gè)命令的接口,聲明一個(gè)
execute()執(zhí)行方法 - 創(chuàng)建一個(gè)請(qǐng)求類(lèi),里面有若干方法。這個(gè)方法原本是直接被調(diào)用的,現(xiàn)在要被外面包裹成命令,然后多個(gè)命令放到一個(gè)執(zhí)行類(lèi)中按順序執(zhí)行。
- 實(shí)現(xiàn)命令接口,每個(gè)命令類(lèi)代表不同的操作。構(gòu)造方法接收一個(gè)請(qǐng)求類(lèi),然后在
execute()方法中對(duì)于具體執(zhí)行操作封裝。 - 創(chuàng)建一個(gè)命令調(diào)用類(lèi),類(lèi)中包含一個(gè)列表存儲(chǔ)放入的命令類(lèi)。其中主要包含
- 命令列表(list)
- 添加命令的方法
- 刪除命令的方法
- 循環(huán)調(diào)用命令列表中的命令的執(zhí)行方法
- 還可以有記錄執(zhí)行了那些命令的方法...(可以根據(jù)記錄還原)
- 還可以加上
undo()方法,用于撤銷(xiāo)執(zhí)行的命令。具體實(shí)現(xiàn)要結(jié)合業(yè)務(wù)。
- 向命令盜用類(lèi)中添加若干命令,然后調(diào)用執(zhí)行方法統(tǒng)一執(zhí)行所以的命令
三、解釋器模式(Interpreter Pattern)
意圖:將語(yǔ)言或者表達(dá)式解析成具體的操作,例如sql解析,數(shù)學(xué)公式計(jì)算(符號(hào)處理引擎)等
實(shí)現(xiàn):
- 創(chuàng)建表達(dá)式接口
Expression,聲明一個(gè)解析方法interpret - 創(chuàng)建終結(jié)符類(lèi)(不能再分割的元素)比如
1 + 2中的1和2都是終結(jié)符 - 創(chuàng)建非終結(jié)符(還能再被分割)
1 + 2中的+。+號(hào)左右都可以有元素,在語(yǔ)法樹(shù)上就是父節(jié)點(diǎn),擁有左右兩個(gè)子節(jié)點(diǎn)。而終結(jié)符就是葉子節(jié)點(diǎn)。 - 終結(jié)符和非終結(jié)符都在解析里定義好自己的功能,
如1 + 1中的終結(jié)符就是構(gòu)造函數(shù)接受字符串并轉(zhuǎn)化成int類(lèi)型保存。
非終結(jié)符+就是構(gòu)造函數(shù)中接收兩個(gè)終結(jié)符,并調(diào)用其解析方法結(jié)果相加返回 - 將需要解釋的字符串構(gòu)建成語(yǔ)法樹(shù),即非終結(jié)符是父節(jié)點(diǎn),終結(jié)符是葉子節(jié)點(diǎn)的樹(shù)。然后深度遍歷并解析。
四、迭代器模式(Iterator Pattern)
意圖: 提供一個(gè)方便的遍歷集合的方法,但是不用暴露內(nèi)部結(jié)構(gòu)。
例子: Java中的集合迭代器
實(shí)現(xiàn):
- 創(chuàng)建一個(gè)迭代器接口,內(nèi)部聲明
hasNext()和next()方法 - 創(chuàng)建一個(gè)集合類(lèi),內(nèi)部構(gòu)件好存儲(chǔ)的結(jié)構(gòu),并實(shí)現(xiàn)迭代器接口
- 內(nèi)部使用一個(gè)游標(biāo)存儲(chǔ)當(dāng)前訪(fǎng)問(wèn)位置,
int index -
hasNext方法返回游標(biāo)是否到了結(jié)尾 -
next方法返回當(dāng)前游標(biāo)所在的元素,并且游標(biāo)下移。
五、中介者模式(Mediator Pattern)
用于降低對(duì)象和類(lèi)之間的通信復(fù)雜性。遵循迪米特原則,即最少知道原則。
將原來(lái)網(wǎng)狀的通信方式轉(zhuǎn)換成星型的結(jié)構(gòu),所有的類(lèi)都通過(guò)一個(gè)中介類(lèi)進(jìn)行交流。
實(shí)現(xiàn):
- 創(chuàng)建一個(gè)中介類(lèi),其中有發(fā)送信息的方法
- 創(chuàng)建溝通的類(lèi),其中的發(fā)送方法使用的就是中介類(lèi)的方法進(jìn)行發(fā)送
六、備忘錄模式(Memento Pattern)
允許獲取類(lèi)的內(nèi)部狀態(tài),并且可以設(shè)置狀態(tài)以便回復(fù)到導(dǎo)出時(shí)的狀態(tài)。
在不破壞封裝的前提下可以完成類(lèi)的備份還原,可以用作游戲存檔、撤銷(xiāo)操作、歷史、事務(wù)等。
實(shí)現(xiàn):
- 創(chuàng)建狀態(tài)的類(lèi),其中的成員變量就是從需要還原的類(lèi)中提取出來(lái)的變量。
- 創(chuàng)建用于存儲(chǔ)和獲取狀態(tài)的類(lèi),其中用集合保存狀態(tài)類(lèi)。
- 需要還原的類(lèi)中實(shí)現(xiàn)提取狀態(tài)和通過(guò)狀態(tài)類(lèi)還原的操作,提取也就是把相應(yīng)的變量賦值給狀態(tài)類(lèi),還原就是把狀態(tài)類(lèi)的信息保存到相應(yīng)變量。
七、觀(guān)察者模式(Observer Pattern)
訂閱/發(fā)布 的模式,發(fā)布消息后會(huì)通知所有訂閱了這個(gè)主題topic的類(lèi)。
和中介模式的區(qū)別是這個(gè)是很明顯的主體和客體的結(jié)構(gòu),一個(gè)主體發(fā)送信息,多個(gè)客體接收。
中介模式是所有的類(lèi)只關(guān)心自己和中介類(lèi)之間的關(guān)系,溝通全部交給中介處理。
實(shí)現(xiàn)(mqtt的例子):
- 設(shè)備連接
mqtt服務(wù)器時(shí)維持連接(tcp) - 設(shè)備主動(dòng)訂閱主題,服務(wù)器根據(jù)主題保存相應(yīng)設(shè)備信息(在集合里保存觀(guān)察者的信息)
- 主題有新的發(fā)布后推送給訂閱了此主題的設(shè)備
八、狀態(tài)模式(State Pattern)
意圖:
允許類(lèi)的內(nèi)部在狀態(tài)發(fā)生改變時(shí)改變他的行為
代碼中有很多改變對(duì)象狀態(tài)的條件語(yǔ)句時(shí),可以使用狀態(tài)模式將部分條件語(yǔ)句隱藏在類(lèi)中
把類(lèi)的可能出現(xiàn)的狀態(tài)都列舉并封裝了
缺點(diǎn):
結(jié)構(gòu)較為復(fù)雜
對(duì)于開(kāi)閉原則的支持不是很好,增加狀態(tài)一定要修改邏輯
類(lèi)會(huì)變龐大
實(shí)現(xiàn):
在類(lèi)中聲明一個(gè)狀態(tài)的屬性
進(jìn)行操作之前判斷一下?tīng)顟B(tài),然后再執(zhí)行相應(yīng)的動(dòng)作
九、策略模式(Strategy Pattern)
策略模式就是把操作邏輯封裝成不同的類(lèi),通過(guò)選擇不同的類(lèi)實(shí)例化就是選擇不同的策略。
這種模式可以減少if...else的判斷次數(shù),邏輯清晰。
算法自由切換,并且拓展性良好
缺點(diǎn)是會(huì)增加代碼量
spring中可以直接把類(lèi)注冊(cè)為組件,然后再通過(guò)名字注入。很方便就能實(shí)現(xiàn)
實(shí)現(xiàn):
創(chuàng)建策略的接口,內(nèi)部有具體的操作方法
創(chuàng)建不同的策略實(shí)現(xiàn)類(lèi),例如+的策略,就是把傳入值相加。-的策略就是把傳入值相減。
實(shí)例化策略類(lèi),并使用接口操作,執(zhí)行操作方法。
因?yàn)槭鞘褂媒涌诓僮?,所以策略?lèi)可以更換成其它的策略也可以正常運(yùn)行
十、模板模式(Template Pattern)
意圖:在抽象類(lèi)中寫(xiě)好其它幾個(gè)抽象方法直接的調(diào)用關(guān)系,具體方法讓子類(lèi)實(shí)現(xiàn)。即搭建好累的框架,細(xì)節(jié)讓子類(lèi)自己實(shí)現(xiàn)。
實(shí)現(xiàn):
- 創(chuàng)建一個(gè)游戲的抽象類(lèi),內(nèi)部有初始游戲、開(kāi)始游戲、結(jié)束游戲三個(gè)抽象方法
- 增加一個(gè)
final play方法,按順序調(diào)用初始、開(kāi)始、結(jié)束三個(gè)抽象方法。以指明子類(lèi)的執(zhí)行順序也是這樣 - 創(chuàng)建子類(lèi),實(shí)現(xiàn)此抽象類(lèi)。實(shí)現(xiàn)具體的抽象方法
- 通過(guò)父類(lèi)執(zhí)行
play方法
十一、訪(fǎng)問(wèn)者模式(Visitor Pattern)
意圖:當(dāng)一個(gè)類(lèi)的數(shù)據(jù)結(jié)構(gòu)很穩(wěn)固,但是操作容易改變。或者類(lèi)中有很多和結(jié)構(gòu)無(wú)關(guān)的操作,防止這些操作改變類(lèi)的數(shù)據(jù)。所以采用訪(fǎng)問(wèn)者模式進(jìn)行數(shù)據(jù)和操作的分離。
有良好的拓展性,符合單一職責(zé)原則,靈活
關(guān)鍵:數(shù)據(jù)類(lèi)中實(shí)現(xiàn)一個(gè)接收訪(fǎng)問(wèn)的方法,并調(diào)用訪(fǎng)問(wèn)者的訪(fǎng)問(wèn)方法,傳入自身
訪(fǎng)問(wèn)者根據(jù)傳入的數(shù)據(jù)類(lèi)進(jìn)行操作
實(shí)現(xiàn):
- 創(chuàng)建一個(gè)被訪(fǎng)問(wèn)接口,內(nèi)部有一個(gè)被訪(fǎng)問(wèn)的方法,入?yún)⑹窃L(fǎng)問(wèn)者接口
- 訪(fǎng)問(wèn)者接口,內(nèi)部有訪(fǎng)問(wèn)的方法,入?yún)⑹潜辉L(fǎng)問(wèn)者接口
- 實(shí)現(xiàn)接口
- 訪(fǎng)問(wèn)者需要訪(fǎng)問(wèn)時(shí)就直接調(diào)用被訪(fǎng)問(wèn)者的被訪(fǎng)問(wèn)方法,并使用入?yún)⒉僮髦怠?/li>
其它設(shè)計(jì)模式
空對(duì)象模式(Null Object Pattern)
意圖:用一個(gè)代表空的對(duì)象代替null,空對(duì)象相對(duì)于null可以擁有默認(rèn)的行為。
實(shí)現(xiàn):
創(chuàng)建一個(gè)對(duì)象接口,有isNil和相應(yīng)操作的方法
創(chuàng)建一個(gè)空對(duì)象,并實(shí)現(xiàn)isNil方法,用于判斷當(dāng)前方法是否為空。并賦予默認(rèn)方法,例如輸出當(dāng)前為空
創(chuàng)建非空對(duì)象,實(shí)現(xiàn)isNil方法,并實(shí)現(xiàn)操作方法,如輸出非空
然后就可以使用了,比如從集合中取出非空元素并執(zhí)行。
-》 遍歷集合,判斷是否為空,并執(zhí)行默認(rèn)方法