設(shè)計(jì)模式
創(chuàng)建型
- 簡單工廠寿弱、工廠方法著瓶、抽象工廠
1.工廠是某個(gè)創(chuàng)建方法延遲到子類奖亚,抽象工廠是 一組成套的方法 封裝在一個(gè)子類
- 單例
1.可以用enum實(shí)現(xiàn)
2.雙重校驗(yàn)方式
注意volital的作用:可見性羔沙、防止指令重排序(可能先執(zhí)行 引用賦值 的指令揪阿,再執(zhí)行 構(gòu)造函數(shù)初始化 的指令雁仲。這樣會(huì)導(dǎo)致其他線程判斷 引用不為空 而直接開始使用仔夺,而此時(shí) 引用對應(yīng)的對象 還沒有初始化)
- 原型
- 建造者
1.client多次調(diào)用某一個(gè)建造者的多個(gè)構(gòu)造方法,最終從建造者中獲取組裝好的一個(gè)產(chǎn)品
結(jié)構(gòu)型
- 適配器
1.類級別適配器
類級別進(jìn)行接口的實(shí)現(xiàn)攒砖。這樣所有實(shí)現(xiàn)類都要實(shí)現(xiàn)對應(yīng)的接口方法缸兔。
2.對象級別適配器
就是通過組合模式實(shí)現(xiàn)。adpter為了實(shí)現(xiàn)適配的接口功能吹艇,調(diào)用被適配實(shí)例對象的方法惰蜜。
- 橋接
1.涉及2個(gè)方向的演化。其中abstraction維度的變化會(huì)比較多受神,比較靈活抛猖,implementor維度基本都是固定的功能實(shí)現(xiàn)。
2.說人話就是abstraction的子類可能會(huì)隨時(shí)增加各種新方法路克,用來實(shí)現(xiàn)個(gè)性化的功能樟结,而其橋接的implementor則比較固定,只是用來在abstraction定義的方法中用來實(shí)現(xiàn)固定的功能精算。
3.跟組合模式的差別在于其在abstraction維度有演化瓢宦。
- 裝飾
- 主要涉及2方面的對象。1是具體的實(shí)現(xiàn)類灰羽,2是裝飾類驮履。其關(guān)鍵點(diǎn)在于:裝飾類會(huì)持有一個(gè)實(shí)現(xiàn)類的引用。
- 示例:答辯升級書寫ppt廉嚼。低級別負(fù)責(zé)具體的ppt書寫玫镐,領(lǐng)導(dǎo)及boss負(fù)責(zé)裝飾一下(評語,OKR)怠噪。
- 外觀
- 享元
- 代理
1.意圖
為其它對象提供一種代理恐似,以便控制對該對象的訪問
2.一些可以使用proxy模式的常見情況
遠(yuǎn)程代理remote proxy:
為一個(gè)對象在不同的地址空間提供代理。比如proxy負(fù)責(zé)對請求進(jìn)行編碼傍念,并向不同地址的對象發(fā)送請求矫夷。
虛代理virtual proxy:
根據(jù)需要?jiǎng)?chuàng)建開銷很大的對象葛闷。代理保存一部分常用的或簡單的信息,以延遲對真實(shí)對象的初始化和其它請求双藕。
保護(hù)代理protection proxy:
控制對原始對象的訪問淑趾,比如權(quán)限控制
行為模式
- 觀察者
1.又叫 發(fā)布-訂閱
2.有推和拉2種模式。在拉模式下忧陪,可以只告訴觀察者更新消息扣泊,讓它自己去拉具體信息。
- 狀態(tài)state
1.意圖
允許對象在其內(nèi)部狀態(tài)改變時(shí)嘶摊,改變其行為延蟹。對象看起來像修改了它的類。
2.適用性
一個(gè)對象的行為取決于它的狀態(tài)叶堆,并且它必須在運(yùn)行時(shí)刻根據(jù)狀態(tài)改變它的行為等孵。
一個(gè)操作中含有多分支,通常每個(gè)分支都需要根據(jù)狀態(tài)再做一次區(qū)分蹂空。
3.協(xié)作
后繼狀態(tài)的維護(hù)可以有context或者具體的state子類維護(hù)俯萌。context本身可以作為參數(shù)傳入state子類。
- 訪問者visitor
1.關(guān)鍵點(diǎn)
每一個(gè)visitor中上枕,都包含了所有結(jié)構(gòu)對象的對應(yīng)方法咐熙。
2.好處
可以方便的添加visitor的行為。比如要對所有結(jié)構(gòu)對象都添加一種check行為辨萍,只需要新增一個(gè)visitor棋恼,該visitor實(shí)現(xiàn)針對每一個(gè)結(jié)構(gòu)對象的check實(shí)現(xiàn)即可。
- 命令
- 每一個(gè)命令都關(guān)聯(lián)到一個(gè)reciver接收者锈玉。
- 模板+策略
模板定義算法執(zhí)行步驟爪飘,中間會(huì)調(diào)用到抽象方法。子類實(shí)現(xiàn)抽象方法拉背。
- 享元
享元本身只保存 內(nèi)部 狀態(tài)师崎,外部在調(diào)用享元的方法時(shí),會(huì)傳入 外部狀態(tài) 給享元椅棺,以便享元使用外部狀態(tài)犁罩,并結(jié)合享元自身的內(nèi)部狀態(tài)來完成方法操作。
由于享元本身內(nèi)部狀態(tài)對所有外部使用者都是統(tǒng)一固定的两疚,所以享元可以被復(fù)用床估,避免創(chuàng)建大量的類似對象。
- 職責(zé)鏈
適用場景是
- 備忘錄
記錄對象每一個(gè)時(shí)刻的所有狀態(tài)值
- 組合诱渤、迭代器丐巫、解釋器、中介者、享元递胧、備忘錄鸦做、外觀、職責(zé)鏈