創(chuàng)建型模式
單例模式 Singleton
概念
保證一個(gè)類(lèi)僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)
適用性
在內(nèi)存中,如果需要某個(gè)類(lèi)的對(duì)象,在程序上保證,有且只有一個(gè)該類(lèi)的對(duì)象
例子
- 餓漢式
Class.forName("");
類(lèi)加載到內(nèi)存后,就實(shí)例化一個(gè)單例,該實(shí)例和構(gòu)造方法都是私有的,無(wú)法通過(guò)new的方式創(chuàng)建對(duì)象。缺點(diǎn):不管用到與否,類(lèi)裝載時(shí)就完成實(shí)例化。 - 懶漢式
首次使用該類(lèi)時(shí),創(chuàng)建該實(shí)例。每次調(diào)用getInstance()時(shí),會(huì)檢查INSTANCE對(duì)象是否已經(jīng)創(chuàng)建,沒(méi)有則會(huì)去創(chuàng)建,有則直接返回。
會(huì)引發(fā)線程安全問(wèn)題:判斷為空之后,進(jìn)行實(shí)例創(chuàng)建,在這兩條語(yǔ)句之間其他線程可能也會(huì)去做檢測(cè)和創(chuàng)建,可能會(huì)創(chuàng)建多次。并不能保證獲得的實(shí)例時(shí)同一個(gè)。 - 解決懶漢式線程安全問(wèn)題
- 上鎖
給靜態(tài)獲得實(shí)例方法加上synchronized關(guān)鍵字,鎖住的是這個(gè)類(lèi),效率下降。 - 鎖代碼塊
不給靜態(tài)方法加,而是在判空之后的創(chuàng)建實(shí)例的語(yǔ)句塊前后加。但是創(chuàng)建語(yǔ)句這兩行之間,也存在線程競(jìng)爭(zhēng)的問(wèn)題。 - 雙判空
代碼塊加鎖之后,再進(jìn)行一次實(shí)例的判空,以防加鎖前已經(jīng)有線程對(duì)該變量進(jìn)行操作。
要用volatile修飾實(shí)例變量,volatile保證可見(jiàn)性,防止指令重排序。如果不用的話,該對(duì)象在加鎖內(nèi)部判空之后,進(jìn)行創(chuàng)建時(shí),由于new關(guān)鍵字的創(chuàng)建過(guò)程(分配內(nèi)存,創(chuàng)建實(shí)例[默認(rèn)值,并未初始化],進(jìn)行初始化),可能第二步就被其他線程訪問(wèn)(判空時(shí)此時(shí)不為空)并返回了,此時(shí)未完成初始化。 - 靜態(tài)內(nèi)部類(lèi)
靜態(tài)內(nèi)部類(lèi)中,創(chuàng)建該類(lèi)的final static型的實(shí)例。
加載時(shí),不會(huì)加載內(nèi)部類(lèi),可以實(shí)現(xiàn)懶加載。 - 枚舉單例
可以解決線程同步,也可以防止反序列化。
抽象工廠模式 Abstract Factory
概念
提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無(wú)需指定它們具體的類(lèi)
用法
任意定制產(chǎn)品一族 (一系列)
一個(gè)抽象工廠,含有不同族的具體工廠,可以創(chuàng)建不同的系列。而具體系列會(huì)隨著族的改變而改變
例子
我有一個(gè)抽象工廠,有一套方法,但是沒(méi)有實(shí)現(xiàn),我也不知道我會(huì)創(chuàng)建出什么內(nèi)容。我有若干子類(lèi)工廠,和我有相同的這套方法,不同的子類(lèi)工廠,會(huì)有不同系列的該套方法的實(shí)現(xiàn)方式。

工廠方法 Factory Method
概念
提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無(wú)需指定它們具體的類(lèi)
用法
任意定制生產(chǎn)過(guò)程創(chuàng)建某某具體實(shí)例的工廠類(lèi),含有該類(lèi)的實(shí)例的創(chuàng)建方法。如,XXXFactory.craete(),通過(guò)工廠的不同創(chuàng)建方法去完成不同實(shí)例的創(chuàng)建。
例子
我有一個(gè)工廠接口,含有創(chuàng)建食物的方法,但是我不實(shí)現(xiàn)。我有3種工廠子類(lèi)/實(shí)現(xiàn)類(lèi),它們也有創(chuàng)建食物方法,是具體的特定的食物。那么我在獲得該工廠時(shí)可以指定獲得哪個(gè)子工廠,交由子工廠去完成創(chuàng)建這一過(guò)程。
建造者模式
概念
將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示
作用
分離復(fù)雜對(duì)象的構(gòu)建和表示;同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。
建造者模式是在當(dāng)創(chuàng)建復(fù)雜對(duì)象的算法應(yīng)該獨(dú)立于該對(duì)象的組成部分以及它們的裝配方式時(shí)適用的模式
例子
Person類(lèi)含有一個(gè)personBuilder的構(gòu)建類(lèi),內(nèi)涵一Person成員變量;
含有不同的賦予Persion屬性的方法,返回的是PersonBuilder這個(gè)類(lèi)。
最后用build()方法將該P(yáng)erson類(lèi)返回出去。
原型模式
概念
用原型實(shí)例指定創(chuàng)建對(duì)象的種類(lèi),并且通過(guò)拷貝這些原型創(chuàng)建新的對(duì)象。
例子
Java的客隆clone()
原型模式需要實(shí)現(xiàn)標(biāo)記型接口Cloneable,一般會(huì)重寫(xiě)clone()方法,如果只是重寫(xiě)clone()方法而未實(shí)現(xiàn)接口,調(diào)用會(huì)報(bào)異常。一般用于一個(gè)對(duì)象的屬性已經(jīng)確定,需要產(chǎn)生很多相同對(duì)象的時(shí)候。
深克隆與淺克隆
原類(lèi)中的屬性,也要進(jìn)行克隆,開(kāi)辟一塊新的內(nèi)存,而不是指向之前對(duì)象的內(nèi)存。這個(gè)時(shí)候克隆前后的兩個(gè)成員屬性就不會(huì)相等了。
但是String 類(lèi)型,不會(huì)被深克隆,String類(lèi)型的成員屬性克隆后依然是原來(lái)那個(gè)String。如果用的是StringBuilder類(lèi)型,克隆時(shí)不對(duì)該類(lèi)型做克隆方法的重寫(xiě),那么依然指向的是原來(lái)那個(gè)StringBuilder,類(lèi)似于原來(lái)那個(gè)成員屬性。
如果克隆對(duì)象含有復(fù)雜成員對(duì)象,那么也要重寫(xiě)該成員對(duì)象對(duì)應(yīng)類(lèi)的clone方法,讓它克隆時(shí)去自己開(kāi)辟內(nèi)存而非指向原油對(duì)象的那塊內(nèi)存地址。

結(jié)構(gòu)型模式
適配器模式 Adapter
概念
將一個(gè)類(lèi)的接口轉(zhuǎn)換為客戶希望的另一個(gè)接口。使得原本由于接口不兼容而不能一起工作的那些類(lèi)可以一起工作。
適用場(chǎng)合
- 應(yīng)用于希望復(fù)用一些現(xiàn)存的類(lèi),但是接口與復(fù)用環(huán)境要求不一致的情況
例子
Java.io包中,F(xiàn)ileInputStream,獲得文件的輸入流,是按字節(jié)讀取的;InputStreamReader,將文件字節(jié)輸入流轉(zhuǎn)化為字符輸入流;BufferedRead,將字符輸入流轉(zhuǎn)化為可緩沖的,按行讀取的流。
微軟的ODBC,可以使用橋接方法轉(zhuǎn)化為JDBC供Java訪問(wèn)SQL Server。

橋接模式 Bridge
概念
將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化
理解
雙維度擴(kuò)展;
分離抽象與具體,用聚合的方式連接抽象和具體。
實(shí)現(xiàn),指的是抽象類(lèi)和它的派生類(lèi)用來(lái)實(shí)現(xiàn)自己的對(duì)象。
實(shí)現(xiàn)系統(tǒng)可能有多角度分類(lèi),每一種分類(lèi)都可能變化,那么把這種多角度分離出來(lái),讓它們獨(dú)立變化,減少它們之間的耦合。
例子
比如把人進(jìn)行分類(lèi),按性別分類(lèi)可以分為男女;按照職業(yè)分類(lèi)可以分為運(yùn)動(dòng)員與藝術(shù)家;如果在男人類(lèi)下面再分為難藝術(shù)家和女藝術(shù)家,那么當(dāng)職業(yè)分類(lèi)有新擴(kuò)展時(shí),要重寫(xiě)男人類(lèi),也要重寫(xiě)女人類(lèi)。但是,人這個(gè)父類(lèi),可以擁有一個(gè)叫做職業(yè)的子類(lèi),擴(kuò)展的時(shí)候只要想職業(yè)子類(lèi)增加其他具體職業(yè);從另一個(gè)性別類(lèi)的維度看,即當(dāng)前性別的人可以擁有/持有職業(yè)這么一重身份,也就是成員屬性,實(shí)現(xiàn)【用聚合代替繼承】,只需要傳遞進(jìn)來(lái)即可。再職業(yè)類(lèi)進(jìn)行擴(kuò)展而不會(huì)影響性別類(lèi)的內(nèi)部結(jié)構(gòu)。
組合模式 Composite
組合模式可以讓客戶一致地使用組合結(jié)構(gòu)體和單個(gè)對(duì)象。
概念
將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)。組合模式使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性
例子
打印的時(shí)候如果是分支節(jié)點(diǎn)則遞歸地調(diào)用分支節(jié)點(diǎn)中的tree()方法,完成文件結(jié)構(gòu)的展示
使用場(chǎng)合
需求中使體現(xiàn)部分與整體層次時(shí)的結(jié)構(gòu)時(shí),以及希望用戶可以忽略組合對(duì)象與單個(gè)對(duì)象的不同,同一地使用組合結(jié)構(gòu)中的所有對(duì)象時(shí)。

裝飾器模式 Decorator
用聚合替代繼承
向裝飾者類(lèi)傳遞一個(gè)基礎(chǔ)類(lèi),可以豐富或者說(shuō)增強(qiáng)基礎(chǔ)類(lèi)的一些同名方法。
概念
動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé),就增加功能來(lái)說(shuō),裝飾者模式比生成子類(lèi)更加靈活。
特點(diǎn)
- 無(wú)限繼承會(huì)產(chǎn)生類(lèi)爆炸的情況,采用裝飾模式,修飾部分的類(lèi)可以自由發(fā)展。
- 新的裝飾類(lèi),含有原有的類(lèi),而不是繼承關(guān)系。聚合非繼承。可以在已經(jīng)有的類(lèi)的基礎(chǔ)上,新增業(yè)務(wù)功能。
例子
在Java的IO流中,Reader類(lèi) 聚合了一個(gè) InputStream。

分離每個(gè)裝飾對(duì)象的實(shí)現(xiàn)和使用,每個(gè)裝飾對(duì)象只關(guān)心自己的功能,不需要關(guān)心如何被添加到對(duì)象鏈當(dāng)中。
門(mén)面模式 Facade
概念
為子系統(tǒng)中的一組接口提供一個(gè)一致的界面,此模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用
用途
- 隱藏內(nèi)部細(xì)節(jié),實(shí)現(xiàn)模型與視圖分離
使用場(chǎng)合
- 設(shè)計(jì)初期,將架構(gòu)分層,如MVC的層與層之間建立外觀Facade。
- 開(kāi)發(fā)節(jié)點(diǎn),子系統(tǒng)因重構(gòu)而變復(fù)雜,增加外觀Facade可以提供一個(gè)簡(jiǎn)單的接口,減少依賴
- 維護(hù)遺留的大型系統(tǒng),開(kāi)發(fā)Facade類(lèi),為設(shè)計(jì)粗糙或高度復(fù)雜的遺留代碼提供比較清晰的借口,讓新系統(tǒng)與Facade對(duì)象交互,F(xiàn)acade與遺留代碼交互所有復(fù)雜的工作。
享元模式 Flyweight
概念
運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對(duì)象
理解
共享元數(shù)據(jù),把數(shù)據(jù)放到一個(gè)大池子里下次不需要再創(chuàng)建只需要去池子里拿
例子
String類(lèi)型 的intern()方法,獲得該字符串對(duì)象在常量池中的引用,如果字面量相等,那么從池中獲得的是同一個(gè)引用
代理模式 Proxy
概念
為其他對(duì)象提供一種代理,以控制對(duì)這個(gè)對(duì)象的訪問(wèn)
例子
- 靜態(tài)代理
知道代理的對(duì)象和需要增強(qiáng)的方法;
代理類(lèi)實(shí)現(xiàn)Movable接口,完成對(duì)坦克的記錄時(shí)間和記錄日志的功能。聚合了他Moable對(duì)象,增強(qiáng)了move()方法。 - 動(dòng)態(tài)代理
- jdk動(dòng)態(tài)代理必須面向接口,調(diào)用Proxy類(lèi)的newInstance方法創(chuàng)建代理對(duì)象,傳遞被代理對(duì)象的類(lèi)加載器,接口數(shù)組和調(diào)用處理器(傳遞被代理對(duì)戲,重寫(xiě)其invoke方法,動(dòng)態(tài)實(shí)現(xiàn)方法增強(qiáng))
- cglib動(dòng)態(tài)代理則面向類(lèi)(待補(bǔ)充)

行為模式
命令模式 Command
概述
將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而使你可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化;對(duì)請(qǐng)求排隊(duì)或者記錄請(qǐng)求日志,以及支持可撤銷(xiāo)的操作。
適用性
- 抽象出待執(zhí)行的動(dòng)作以參數(shù)化某對(duì)象(ConcreteCommand)
- 在不同的時(shí)刻指定、排列和執(zhí)行請(qǐng)求
- 撤銷(xiāo)
- 支持修改日志,系統(tǒng)崩潰時(shí),丟改可以重新執(zhí)行
責(zé)任鏈模式 Chain of Responsibility
概述
使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免請(qǐng)求的發(fā)送者和接受者之間的耦合關(guān)系。將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞該請(qǐng)求,直到有一個(gè)對(duì)象處理它為止。這一模式的想法是,給多個(gè)對(duì)象處理一個(gè)請(qǐng)求的機(jī)會(huì),從而解耦發(fā)送者和接受者。
適用性
- 多個(gè)對(duì)象可以處理一個(gè)請(qǐng)求,哪個(gè)對(duì)象處理該請(qǐng)求運(yùn)行時(shí)刻自動(dòng)確定
- 在不明確指定接收者的情況下,向多個(gè)對(duì)象中的一個(gè)提交一個(gè)請(qǐng)求
- 可處理一個(gè)請(qǐng)求的對(duì)象集合應(yīng)被動(dòng)態(tài)地指定
類(lèi)圖

鏈對(duì)象持有一個(gè)集合,用于存放不同的接收器,可以向鏈對(duì)象添加兩個(gè)具體的過(guò)濾器接收器,完成不同的過(guò)濾功能。當(dāng)需求來(lái)時(shí),鏈會(huì)遍歷旗下所有的接收器,執(zhí)行處理功能,而接收器也可以是一個(gè)鏈對(duì)象。類(lèi)似廣義數(shù)組。
解析器模式 Interpretor
概述
給定一個(gè)語(yǔ)言,定義它的文法的一種表示,并定義一個(gè)解釋器,這個(gè)解釋器使用該表示來(lái)解釋語(yǔ)言中的句子
適用性
當(dāng)有一個(gè)語(yǔ)言需要解釋執(zhí)行,并且你可將該語(yǔ)言中的句子表示為一個(gè)抽象語(yǔ)法樹(shù)時(shí),可使用解釋器模式。而當(dāng)存在以下情況時(shí),該模式效果最好
- 該文法簡(jiǎn)單,對(duì)于復(fù)雜的文法,文法的層次變得龐大而無(wú)法管理
- 效率不是一個(gè)關(guān)鍵問(wèn)題,最高效的解釋器通常不是通過(guò)直接解釋語(yǔ)法分析樹(shù)實(shí)現(xiàn)的,而是首先將它們轉(zhuǎn)換成另一種形式。
迭代器模式 Iterator
概述
提供一種方法順序訪問(wèn)一個(gè)聚合對(duì)象中的各個(gè)元素,而又不暴露該對(duì)象的內(nèi)部表示
適用性
- 對(duì)聚合有多種遍歷方式時(shí),可以考慮迭代器模式
- 為遍歷不同的聚集結(jié)構(gòu),提供如開(kāi)始,下一個(gè),是否結(jié)束,當(dāng)前那一項(xiàng)等統(tǒng)一接口
- 分離了集合對(duì)象的遍歷行為,抽象出一個(gè)迭代器類(lèi)來(lái)負(fù)責(zé),這樣既可以做到不暴露集合的內(nèi)部結(jié)構(gòu),又可以讓外部代碼透明地訪問(wèn)集合內(nèi)部的數(shù)據(jù)
類(lèi)圖

集合接口持有自己的迭代器,具體的集合持有自己的具體的迭代器,在具體迭代器中含有下一個(gè),訪問(wèn)當(dāng)前元素等方法的具體實(shí)現(xiàn)(與容器結(jié)構(gòu)有關(guān))。
中介者模式 Mediator
概念
用一個(gè)中介對(duì)象來(lái)封裝一系列的對(duì)象交互。中介者使各對(duì)象不需要顯示地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互
適用性
- 一組對(duì)象以定義良好但是復(fù)雜的方式進(jìn)行通信,產(chǎn)生的相互依賴關(guān)系結(jié)構(gòu)混亂,難以理解。
- 一個(gè)對(duì)象引用其他很多對(duì)象,并且直接與這些對(duì)象通信,難以復(fù)用該對(duì)象。
-
定制一個(gè)分布在多個(gè)類(lèi)中的行為,而又不想生成太多子類(lèi)。
中介者模式.png
為了遵循迪米特法則,盡量降低類(lèi)之間的耦合程度,避免直接交互;如果兩個(gè)類(lèi)不必彼此直接通信,那么這兩個(gè)類(lèi)不應(yīng)當(dāng)發(fā)生直接的相互作用。如果其中一個(gè)類(lèi)要調(diào)用另一個(gè)類(lèi)的方法,可以通過(guò)第三個(gè)類(lèi)轉(zhuǎn)發(fā)這個(gè)調(diào)用。
demo理解:中介者類(lèi)持有所有打交道的類(lèi)的實(shí)例,并且有其他下屬類(lèi)的共同方法。下屬類(lèi)調(diào)用自己的方法時(shí),實(shí)際上調(diào)用的是中介者類(lèi)的同名方法,而中介者類(lèi)在執(zhí)行該方法時(shí)會(huì)根據(jù)傳遞進(jìn)來(lái)的類(lèi)進(jìn)行判斷,并執(zhí)行對(duì)應(yīng)的操作。
優(yōu)點(diǎn):Mediator減少了各個(gè)Colleague的耦合,使得可以獨(dú)立地改變和復(fù)用各個(gè)Colleague類(lèi)和Mediator;由于把對(duì)象如何協(xié)作做了抽象,將中介作為一個(gè)獨(dú)立的概念并將其封裝在一個(gè)對(duì)象中,這樣關(guān)注的對(duì)象就從對(duì)象各自本身的行為轉(zhuǎn)移到它們之間的交互上來(lái),也就是站在一個(gè)更宏觀的角度去看待系統(tǒng)(也就是具體實(shí)現(xiàn)細(xì)節(jié)上交給中介者去做,自己的交互/溝通對(duì)象也由中介者去指派和維護(hù))。
缺點(diǎn):由于ConcreteMediator控制了集中化,于是就把交互復(fù)雜性變味了中介者的復(fù)雜性(印證了上條結(jié)論),這就使得中介者會(huì)比任何一個(gè)ConcreteColleague都復(fù)雜。
備忘錄模式 Momento
概述
在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)。這樣以后就可以將該對(duì)象恢復(fù)到原先保存的狀態(tài)。
適用性
- 必須保存一個(gè)對(duì)象在某一個(gè)時(shí)刻的(部分)狀態(tài),這樣以后需要時(shí),它才能恢復(fù)到之前的狀態(tài)
-
如果一個(gè)用接口來(lái)讓其他對(duì)象直接得到這些狀態(tài),將會(huì)暴露對(duì)象的實(shí)現(xiàn)細(xì)節(jié),并破壞對(duì)象的封裝性
備忘錄模式.png
快照存儲(chǔ)那一時(shí)刻原對(duì)象的所有內(nèi)容,保存在快照文件中,可以在后續(xù)時(shí)間內(nèi)將快照文件的內(nèi)容恢復(fù)給原對(duì)象。
觀察者模式
概念
定義了一種一對(duì)多的依賴關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽(tīng)某一個(gè)主題對(duì)象。這個(gè)主題對(duì)象在狀態(tài)發(fā)生變化時(shí),會(huì)通知所有觀察者對(duì)象,使它們能夠自動(dòng)更新自己。
組成
事件源對(duì)象:含有一攬子觀察者(list),含有自己的觸發(fā)若干觀察者的方法,觸發(fā)之后遍歷觀察者,傳遞事件,并調(diào)用它們的方法。
觀察者對(duì)象:觀察者接口,含有一些事件的處理方法(將事件傳遞進(jìn)來(lái));觀察者接口的具體實(shí)現(xiàn)類(lèi),能夠依據(jù)傳來(lái)的事件,完成具體的事件處理方法。
事件:是一個(gè)抽象類(lèi),又一個(gè)獲得事件源的鉤子方法;對(duì)應(yīng)有一個(gè)事件的具體實(shí)現(xiàn)列,依據(jù)與源對(duì)象有關(guān)的信息創(chuàng)建具體事件。
狀態(tài)模式 State
概念
當(dāng)一個(gè)對(duì)象的內(nèi)在狀態(tài)改變時(shí),允許改變其行為,這個(gè)對(duì)象看起來(lái)像是改變了其類(lèi)
適用性
- 一個(gè)對(duì)象的行為,取決于它的狀態(tài),并且它必須在運(yùn)行時(shí)刻根據(jù)狀態(tài)改變它的行為
-
一個(gè)操作中含有龐大的多分支的條件語(yǔ)句,且這些分支依賴于該對(duì)象的狀態(tài)。這個(gè)狀態(tài)通常用一個(gè)或多個(gè)枚舉常量來(lái)表示。通常,有多個(gè)操作包含這一相同的條件結(jié)構(gòu)。State模式將每一個(gè)條件分支放入一個(gè)獨(dú)立的類(lèi)中。這使得你可以根據(jù)對(duì)象自身的情況將對(duì)象的狀態(tài)作為一個(gè)對(duì)象,這一對(duì)象可以不依賴于其他對(duì)象而獨(dú)立變化。
狀態(tài)模式.png
主要解決的是當(dāng)控制一個(gè)對(duì)象狀態(tài)轉(zhuǎn)換的條件表達(dá)式過(guò)于復(fù)雜時(shí)的情況。把狀態(tài)的判斷邏輯轉(zhuǎn)移到表示不同狀態(tài)的一系列類(lèi)中,可以把復(fù)雜的判斷邏輯簡(jiǎn)化。
方法會(huì)依據(jù)狀態(tài)不同而執(zhí)行不同的操作,可以將所有操作移交給狀態(tài)類(lèi)再去執(zhí)行,狀態(tài)類(lèi)要有客戶類(lèi)中的所有方法。
TCP會(huì)根據(jù)連接的不同狀態(tài),比如Established,Listen,Closed,而對(duì)操作Open(),Close(),Acknowledge()有不同的具體執(zhí)行。
策略模式 Strategy
概念
定義了算法家族,分別封裝起來(lái),讓它們之間可以互相替換,此模式讓算法的變化不會(huì)影響到使用算法的客戶
適用情況
- 許多相關(guān)的類(lèi)僅僅是行為有異?!安呗浴碧峁┝艘环N多個(gè)行為中的一個(gè)行為來(lái)配置一個(gè)類(lèi)的方法。
- 需要使用過(guò)一個(gè)算法的不同變體。
- 算法使用戶不應(yīng)知道的數(shù)據(jù),可用策略模式以避免暴露復(fù)雜的、與算法相關(guān)的數(shù)據(jù)結(jié)構(gòu)。
-
使用不同策略實(shí)現(xiàn)不同的條件分支執(zhí)行語(yǔ)句。
策略模式.png
本質(zhì):完成相同工作的實(shí)現(xiàn)手段不同,可以以相同的方式調(diào)用所有的算法,減少了各種算法類(lèi)與使用算法類(lèi)之間的耦合。Strategy類(lèi)層次為Context定義了一系列的可供重用的算法或行為,繼承有助于吸取出這些算法中的公共功能。
模板方法 Template
概念
定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類(lèi)中。模板方法使得子類(lèi)可以不改變一個(gè)算法的結(jié)構(gòu),即可重新定義該算法的某些特定步驟
適用性
- 通過(guò)把不變行為搬遷到父類(lèi),去除子類(lèi)中的重復(fù)代碼。
-
提供了一個(gè)很好的代碼復(fù)用平臺(tái),擺脫不變行為的糾纏。
模板方法.png
訪問(wèn)者模式 Visitor
概念
表示一個(gè)作用于某對(duì)象結(jié)構(gòu)中的各元素的操作。它使你可以在不改變各類(lèi)的前提下定義作用于這些元素的新操作
適用性
- 增加新的操作(來(lái)訪者)很容易,訪問(wèn)者模式能夠?qū)⒂嘘P(guān)的行為集中到一個(gè)訪問(wèn)者對(duì)象中。
-
應(yīng)該是固定的不同的數(shù)據(jù)結(jié)構(gòu),去調(diào)用(accept方法接收)變化多端的不同的來(lái)訪者,不同的來(lái)訪者對(duì)于不同的調(diào)用者有不同的執(zhí)行方法
訪問(wèn)者模式.png
六大原則
單一職責(zé)原則 Single Responsibility Principle
- 高內(nèi)聚,低耦合
- 一個(gè)類(lèi)不要太大,別太累,負(fù)責(zé)單一的職責(zé)
開(kāi)閉原則 Open-Closed Principle
- 對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉;盡量不修改原來(lái)代碼的情況下進(jìn)行擴(kuò)展
- 抽象化,多態(tài)是開(kāi)閉原則的關(guān)鍵
里式替換原則 Liscov Substitution Principle
- 所有使用父類(lèi)的地方,必須能夠透明的使用子類(lèi)對(duì)象
依賴倒置原則 Dependency Inversion Principle
- 依賴抽象,而不是依賴具體;
接口隔離原則 Interface Segregation Principle
- 每一個(gè)接口應(yīng)該承擔(dān)獨(dú)立的角色,不干自己不該干的事
迪米特法則 Law of Demeter
- 盡量不要和陌生人說(shuō)話
- 非陌生人比如
- 當(dāng)前對(duì)象本身 this
- 以參數(shù)形式傳入當(dāng)前對(duì)象方法中的對(duì)象
- 當(dāng)前對(duì)象的成員對(duì)象
- 如果當(dāng)前對(duì)象的成員對(duì)象是一個(gè)集合,那么集合中的元素也是朋友
- 當(dāng)前對(duì)象所創(chuàng)建的對(duì)象





