一贯钩、責任鏈模式(Chain of Responsibility Pattern)
意圖:創(chuàng)建一個處理請求的對象鏈,對象發(fā)送者和對象接受者解耦。責任鏈上的對象如果不能處理請求涌乳,就會把請求發(fā)送給下一個責任鏈節(jié)點布疼。
實現(xiàn):
- 創(chuàng)建責任鏈節(jié)點的抽象類
- 使用抽象類生成若干處理節(jié)點
- 節(jié)點依次連接燕锥,保存下一個節(jié)點的地址
- 當請求進入時判斷是否是自己處理的類型赚楚,不是傳給下一個節(jié)點。
- 請求發(fā)送給責任鏈頭節(jié)點即可
二煌恢、命令模式(Command Pattern)
意圖:將請求(可以是調(diào)用方法的請求)封裝成一個對象骇陈,再創(chuàng)建一個執(zhí)行類,可以向執(zhí)行類中添加請求對象瑰抵,然后再統(tǒng)一執(zhí)行你雌。執(zhí)行前可以任意添加和刪除命令。過程有點類似建造者模式二汛,添加添加然后統(tǒng)一執(zhí)行婿崭。
實現(xiàn):
- 創(chuàng)建一個命令的接口,聲明一個
execute()
執(zhí)行方法 - 創(chuàng)建一個請求類肴颊,里面有若干方法氓栈。這個方法原本是直接被調(diào)用的,現(xiàn)在要被外面包裹成命令婿着,然后多個命令放到一個執(zhí)行類中按順序執(zhí)行颤绕。
- 實現(xiàn)命令接口幸海,每個命令類代表不同的操作。構(gòu)造方法接收一個請求類奥务,然后在
execute()
方法中對于具體執(zhí)行操作封裝。 - 創(chuàng)建一個命令調(diào)用類袜硫,類中包含一個列表存儲放入的命令類氯葬。其中主要包含
- 命令列表(list)
- 添加命令的方法
- 刪除命令的方法
- 循環(huán)調(diào)用命令列表中的命令的執(zhí)行方法
- 還可以有記錄執(zhí)行了那些命令的方法...(可以根據(jù)記錄還原)
- 還可以加上
undo()
方法,用于撤銷執(zhí)行的命令婉陷。具體實現(xiàn)要結(jié)合業(yè)務帚称。
- 向命令盜用類中添加若干命令,然后調(diào)用執(zhí)行方法統(tǒng)一執(zhí)行所以的命令
三秽澳、解釋器模式(Interpreter Pattern)
意圖:將語言或者表達式解析成具體的操作闯睹,例如sql
解析,數(shù)學公式計算(符號處理引擎)等
實現(xiàn):
- 創(chuàng)建表達式接口
Expression
担神,聲明一個解析方法interpret
- 創(chuàng)建終結(jié)符類(不能再分割的元素)比如
1 + 2
中的1
和2
都是終結(jié)符 - 創(chuàng)建非終結(jié)符(還能再被分割)
1 + 2
中的+
楼吃。+
號左右都可以有元素,在語法樹上就是父節(jié)點妄讯,擁有左右兩個子節(jié)點孩锡。而終結(jié)符就是葉子節(jié)點。 - 終結(jié)符和非終結(jié)符都在解析里定義好自己的功能亥贸,
如1 + 1
中的終結(jié)符就是構(gòu)造函數(shù)接受字符串并轉(zhuǎn)化成int
類型保存躬窜。
非終結(jié)符+
就是構(gòu)造函數(shù)中接收兩個終結(jié)符,并調(diào)用其解析方法結(jié)果相加返回 - 將需要解釋的字符串構(gòu)建成語法樹炕置,即非終結(jié)符是父節(jié)點荣挨,終結(jié)符是葉子節(jié)點的樹。然后深度遍歷并解析朴摊。
四默垄、迭代器模式(Iterator Pattern)
意圖: 提供一個方便的遍歷集合的方法,但是不用暴露內(nèi)部結(jié)構(gòu)仍劈。
例子: Java中的集合迭代器
實現(xiàn):
- 創(chuàng)建一個迭代器接口厕倍,內(nèi)部聲明
hasNext()
和next()
方法 - 創(chuàng)建一個集合類,內(nèi)部構(gòu)件好存儲的結(jié)構(gòu)贩疙,并實現(xiàn)迭代器接口
- 內(nèi)部使用一個游標存儲當前訪問位置讹弯,
int index
-
hasNext
方法返回游標是否到了結(jié)尾 -
next
方法返回當前游標所在的元素,并且游標下移这溅。
五组民、中介者模式(Mediator Pattern)
用于降低對象和類之間的通信復雜性。遵循迪米特原則悲靴,即最少知道原則臭胜。
將原來網(wǎng)狀的通信方式轉(zhuǎn)換成星型的結(jié)構(gòu),所有的類都通過一個中介類進行交流。
實現(xiàn):
- 創(chuàng)建一個中介類耸三,其中有發(fā)送信息的方法
- 創(chuàng)建溝通的類乱陡,其中的發(fā)送方法使用的就是中介類的方法進行發(fā)送
六、備忘錄模式(Memento Pattern)
允許獲取類的內(nèi)部狀態(tài)仪壮,并且可以設置狀態(tài)以便回復到導出時的狀態(tài)憨颠。
在不破壞封裝的前提下可以完成類的備份還原,可以用作游戲存檔积锅、撤銷操作爽彤、歷史、事務等缚陷。
實現(xiàn):
- 創(chuàng)建狀態(tài)的類适篙,其中的成員變量就是從需要還原的類中提取出來的變量。
- 創(chuàng)建用于存儲和獲取狀態(tài)的類箫爷,其中用集合保存狀態(tài)類嚷节。
- 需要還原的類中實現(xiàn)提取狀態(tài)和通過狀態(tài)類還原的操作,提取也就是把相應的變量賦值給狀態(tài)類蝶缀,還原就是把狀態(tài)類的信息保存到相應變量丹喻。
七、觀察者模式(Observer Pattern)
訂閱/發(fā)布 的模式翁都,發(fā)布消息后會通知所有訂閱了這個主題topic
的類碍论。
和中介模式的區(qū)別是這個是很明顯的主體和客體的結(jié)構(gòu),一個主體發(fā)送信息柄慰,多個客體接收鳍悠。
中介模式是所有的類只關(guān)心自己和中介類之間的關(guān)系,溝通全部交給中介處理坐搔。
實現(xiàn)(mqtt的例子):
- 設備連接
mqtt
服務器時維持連接(tcp) - 設備主動訂閱主題藏研,服務器根據(jù)主題保存相應設備信息(在集合里保存觀察者的信息)
- 主題有新的發(fā)布后推送給訂閱了此主題的設備
八、狀態(tài)模式(State Pattern)
意圖:
允許類的內(nèi)部在狀態(tài)發(fā)生改變時改變他的行為
代碼中有很多改變對象狀態(tài)的條件語句時概行,可以使用狀態(tài)模式將部分條件語句隱藏在類中
把類的可能出現(xiàn)的狀態(tài)都列舉并封裝了
缺點:
結(jié)構(gòu)較為復雜
對于開閉原則的支持不是很好蠢挡,增加狀態(tài)一定要修改邏輯
類會變龐大
實現(xiàn):
在類中聲明一個狀態(tài)的屬性
進行操作之前判斷一下狀態(tài),然后再執(zhí)行相應的動作
九凳忙、策略模式(Strategy Pattern)
策略模式就是把操作邏輯封裝成不同的類业踏,通過選擇不同的類實例化就是選擇不同的策略。
這種模式可以減少if...else
的判斷次數(shù)涧卵,邏輯清晰勤家。
算法自由切換,并且拓展性良好
缺點是會增加代碼量
spring中可以直接把類注冊為組件柳恐,然后再通過名字注入伐脖。很方便就能實現(xiàn)
實現(xiàn):
創(chuàng)建策略的接口热幔,內(nèi)部有具體的操作方法
創(chuàng)建不同的策略實現(xiàn)類,例如+
的策略讼庇,就是把傳入值相加绎巨。-
的策略就是把傳入值相減。
實例化策略類巫俺,并使用接口操作认烁,執(zhí)行操作方法。
因為是使用接口操作介汹,所以策略類可以更換成其它的策略也可以正常運行
十、模板模式(Template Pattern)
意圖:在抽象類中寫好其它幾個抽象方法直接的調(diào)用關(guān)系舶沛,具體方法讓子類實現(xiàn)嘹承。即搭建好累的框架,細節(jié)讓子類自己實現(xiàn)如庭。
實現(xiàn):
- 創(chuàng)建一個游戲的抽象類叹卷,內(nèi)部有初始游戲、開始游戲坪它、結(jié)束游戲三個抽象方法
- 增加一個
final play
方法骤竹,按順序調(diào)用初始、開始往毡、結(jié)束三個抽象方法蒙揣。以指明子類的執(zhí)行順序也是這樣 - 創(chuàng)建子類,實現(xiàn)此抽象類开瞭。實現(xiàn)具體的抽象方法
- 通過父類執(zhí)行
play
方法
十一懒震、訪問者模式(Visitor Pattern)
意圖:當一個類的數(shù)據(jù)結(jié)構(gòu)很穩(wěn)固,但是操作容易改變嗤详「鋈牛或者類中有很多和結(jié)構(gòu)無關(guān)的操作,防止這些操作改變類的數(shù)據(jù)葱色。所以采用訪問者模式進行數(shù)據(jù)和操作的分離递宅。
有良好的拓展性,符合單一職責原則苍狰,靈活
關(guān)鍵:數(shù)據(jù)類中實現(xiàn)一個接收訪問的方法办龄,并調(diào)用訪問者的訪問方法,傳入自身
訪問者根據(jù)傳入的數(shù)據(jù)類進行操作
實現(xiàn):
- 創(chuàng)建一個被訪問接口舞痰,內(nèi)部有一個被訪問的方法土榴,入?yún)⑹窃L問者接口
- 訪問者接口,內(nèi)部有訪問的方法响牛,入?yún)⑹潜辉L問者接口
- 實現(xiàn)接口
- 訪問者需要訪問時就直接調(diào)用被訪問者的被訪問方法玷禽,并使用入?yún)⒉僮髦怠?/li>
其它設計模式
空對象模式(Null Object Pattern)
意圖:用一個代表空的對象代替null
赫段,空對象相對于null
可以擁有默認的行為。
實現(xiàn):
創(chuàng)建一個對象接口矢赁,有isNil
和相應操作的方法
創(chuàng)建一個空對象糯笙,并實現(xiàn)isNil
方法,用于判斷當前方法是否為空撩银。并賦予默認方法给涕,例如輸出當前為空
創(chuàng)建非空對象,實現(xiàn)isNil
方法额获,并實現(xiàn)操作方法够庙,如輸出非空
然后就可以使用了,比如從集合中取出非空元素并執(zhí)行抄邀。
-》 遍歷集合耘眨,判斷是否為空,并執(zhí)行默認方法