在軟件行業(yè)設(shè)計(jì)模型的想法最早是由四位作者提出的:埃里希·伽馬,約翰·弗里賽德斯,拉爾夫約翰遜,理查德·赫爾姆。1994年,他們四個(gè)人出版了《設(shè)計(jì)模式:可重用面向?qū)ο筌浖脑亍芬粫?shū),他們?cè)跁?shū)中將設(shè)計(jì)模式的概念應(yīng)用到編程中。這本書(shū)介紹了23種模式,解決了面向?qū)ο笤O(shè)計(jì)的各種問(wèn)題,并很快成為暢銷(xiāo)書(shū)。由于它的名字很長(zhǎng),人們開(kāi)始稱(chēng)它為“四人幫的書(shū)”,很快就被簡(jiǎn)稱(chēng)為“GoF書(shū)”。sDV28資訊網(wǎng)——每日最新資訊28at.com
設(shè)計(jì)模式(Design Pattern)是軟件設(shè)計(jì)中常見(jiàn)問(wèn)題的典型解決方案。它們就像預(yù)先制作的開(kāi)發(fā)藍(lán)圖,您可以采用藍(lán)圖來(lái)解決代碼中重復(fù)出現(xiàn)的設(shè)計(jì)問(wèn)題。但設(shè)計(jì)模式并不是像使用現(xiàn)成的函數(shù)或庫(kù)那樣,可以復(fù)制到程序中運(yùn)行。因?yàn)樵O(shè)計(jì)模式不是一段特定的代碼,也不是語(yǔ)法規(guī)范,而是一套用來(lái)提高代碼可復(fù)用性、可維護(hù)性、可讀性、穩(wěn)健性以及安全性的解決方案,是解決軟件開(kāi)發(fā)中特定問(wèn)題的一系列套路。sDV28資訊網(wǎng)——每日最新資訊28at.com
sDV28資訊網(wǎng)——每日最新資訊28at.com
設(shè)計(jì)模式可以分為下面三大類(lèi):sDV28資訊網(wǎng)——每日最新資訊28at.com
創(chuàng)建型:sDV28資訊網(wǎng)——每日最新資訊28at.com
- Factory Method(工廠方法)
- Abstract Factory(抽象工廠)
- Builder(建造者)
- Prototype(原型)
- Singleton(單例)
結(jié)構(gòu)型:sDV28資訊網(wǎng)——每日最新資訊28at.com
- Adapter Class/Object(適配器)
- Bridge(橋接)
- Composite(組合)
- Decorator(裝飾)
- Facade(外觀)
- Flyweight(享元)
- Proxy(代理)
行為型:sDV28資訊網(wǎng)——每日最新資訊28at.com
- Interpreter(解釋器)
- Template Method(模板方法)
- Chain of Responsibility(責(zé)任鏈)
- Command(命令)
- Iterator(迭代器)
- Mediator(中介者)
- Memento(備忘錄)
- Observer(觀察者)
- State(狀態(tài))
- Strategy(策略)
- Visitor(訪問(wèn)者)
sDV28資訊網(wǎng)——每日最新資訊28at.com
一、創(chuàng)建型
1.Factory Method(工廠方法)
sDV28資訊網(wǎng)——每日最新資訊28at.com
(1) 思路:sDV28資訊網(wǎng)——每日最新資訊28at.com
定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類(lèi)決定實(shí)例化哪一個(gè)類(lèi)。Factory Method 使一個(gè)類(lèi)的實(shí)例化延遲到其子類(lèi)。sDV28資訊網(wǎng)——每日最新資訊28at.com
(2) 應(yīng)用場(chǎng)景:sDV28資訊網(wǎng)——每日最新資訊28at.com
- 當(dāng)一個(gè)類(lèi)不知道它所必須創(chuàng)建的對(duì)象的類(lèi)的時(shí)候。
- 當(dāng)一個(gè)類(lèi)希望由它的子類(lèi)來(lái)指定它所創(chuàng)建的對(duì)象的時(shí)候。
- 當(dāng)類(lèi)將創(chuàng)建對(duì)象的職責(zé)委托給多個(gè)幫助子類(lèi)中的某一個(gè),并且你希望將哪一個(gè)幫助子類(lèi)是代理者這一信息局部化的時(shí)候。
2.Abstract Factory(抽象工廠)
sDV28資訊網(wǎng)——每日最新資訊28at.com
(1) 思路:提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴(lài)對(duì)象的接口,而無(wú)需指定它們具體的類(lèi)。sDV28資訊網(wǎng)——每日最新資訊28at.com
(2) 應(yīng)用場(chǎng)景:sDV28資訊網(wǎng)——每日最新資訊28at.com
- 一個(gè)系統(tǒng)要獨(dú)立于它的產(chǎn)品的創(chuàng)建、組合和表示時(shí)。
- 一個(gè)系統(tǒng)要由多個(gè)產(chǎn)品系列中的一個(gè)來(lái)配置時(shí)。
- 當(dāng)需要強(qiáng)調(diào)一系列相關(guān)的產(chǎn)品對(duì)象的設(shè)計(jì)以便進(jìn)行聯(lián)合使用時(shí)。
- 當(dāng)要提供一個(gè)產(chǎn)品類(lèi)庫(kù),而只想顯示它們的接口而不是實(shí)現(xiàn)時(shí)。
3.Builder(建造者)
sDV28資訊網(wǎng)——每日最新資訊28at.com
思路:將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。sDV28資訊網(wǎng)——每日最新資訊28at.com
應(yīng)用場(chǎng)景:sDV28資訊網(wǎng)——每日最新資訊28at.com
- 當(dāng)創(chuàng)建復(fù)雜對(duì)象的算法應(yīng)該獨(dú)立于該對(duì)象的組成部分以及它們的裝配方式時(shí)。
- 當(dāng)構(gòu)造過(guò)程必須允許被構(gòu)造的對(duì)象有不同的表示時(shí)。
4.Prototype(原型)
sDV28資訊網(wǎng)——每日最新資訊28at.com
思路:用原型實(shí)例指定創(chuàng)建對(duì)象的種類(lèi),并且通過(guò)拷貝這些原型創(chuàng)建新的對(duì)象。sDV28資訊網(wǎng)——每日最新資訊28at.com
應(yīng)用場(chǎng)景:sDV28資訊網(wǎng)——每日最新資訊28at.com
- 當(dāng)要實(shí)例化的類(lèi)是在運(yùn)行時(shí)刻指定時(shí),例如,通過(guò)動(dòng)態(tài)裝載;或者
- 為了避免創(chuàng)建一個(gè)與產(chǎn)品類(lèi)層次平行的工廠類(lèi)層次時(shí);或者
- 當(dāng)一個(gè)類(lèi)的實(shí)例只能有幾個(gè)不同狀態(tài)組合中的一種時(shí)。建立一定數(shù)目的原型并克隆它們可能比每次用合適的狀態(tài)手工實(shí)例化該類(lèi)更方便一些。
5.Singleton(單例)
sDV28資訊網(wǎng)——每日最新資訊28at.com
思路:保證一個(gè)類(lèi)僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。sDV28資訊網(wǎng)——每日最新資訊28at.com
應(yīng)用場(chǎng)景:sDV28資訊網(wǎng)——每日最新資訊28at.com
- 當(dāng)類(lèi)只能有一個(gè)實(shí)例而且客戶(hù)可以從一個(gè)眾所周知的訪問(wèn)點(diǎn)訪問(wèn)它時(shí)。
- 當(dāng)這個(gè)唯一實(shí)例應(yīng)該是通過(guò)子類(lèi)化可擴(kuò)展的,并且客戶(hù)應(yīng)該無(wú)需更改代碼就能使用一個(gè)擴(kuò)展的實(shí)例時(shí)。
二、結(jié)構(gòu)型
6.Adapter Class/Object(適配器)
sDV28資訊網(wǎng)——每日最新資訊28at.com
思路:將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶(hù)希望的另外一個(gè)接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些類(lèi)可以一起工作。sDV28資訊網(wǎng)——每日最新資訊28at.com
應(yīng)用場(chǎng)景:sDV28資訊網(wǎng)——每日最新資訊28at.com
- 想使用一個(gè)已經(jīng)存在的類(lèi),而它的接口不符合你的需求。
- 想創(chuàng)建一個(gè)可以復(fù)用的類(lèi),該類(lèi)可以與其他不相關(guān)的類(lèi)或不可預(yù)見(jiàn)的類(lèi)(即那些接口可能不一定兼容的類(lèi))協(xié)同工作。
- 你想使用一些已經(jīng)存在的子類(lèi),但是不可能對(duì)每一個(gè)都進(jìn)行子類(lèi)化以匹配它們的接口。對(duì)象適配器可以適配它的父類(lèi)接口。
7.Bridge(橋接)
sDV28資訊網(wǎng)——每日最新資訊28at.com
思路:將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。sDV28資訊網(wǎng)——每日最新資訊28at.com
應(yīng)用場(chǎng)景:sDV28資訊網(wǎng)——每日最新資訊28at.com
- 不希望在抽象和它的實(shí)現(xiàn)部分之間有一個(gè)固定的綁定關(guān)系。例如這種情況可能是因?yàn)椋诔绦蜻\(yùn)行時(shí)刻實(shí)現(xiàn)部分應(yīng)可以被選擇或者切換。
- 類(lèi)的抽象以及它的實(shí)現(xiàn)都應(yīng)該可以通過(guò)生成子類(lèi)的方法加以擴(kuò)充。這時(shí)Bridge 模式使你可以對(duì)不同的抽象接口和實(shí)現(xiàn)部分進(jìn)行組合,并分別對(duì)它們進(jìn)行擴(kuò)充。
- 對(duì)一個(gè)抽象的實(shí)現(xiàn)部分的修改應(yīng)對(duì)客戶(hù)不產(chǎn)生影響,即客戶(hù)的代碼不必重新編譯。
- 在C++中,類(lèi)的表示在類(lèi)接口中是可見(jiàn)的,而你卻想對(duì)客戶(hù)完全隱藏抽象的實(shí)現(xiàn)部分。
- 有許多類(lèi)要生成。這樣一種類(lèi)層次結(jié)構(gòu)說(shuō)明你必須將一個(gè)對(duì)象分解成兩個(gè)部分。Rumbaugh 稱(chēng)這種類(lèi)層次結(jié)構(gòu)為“嵌套的普化”(nested generalizations )。
- 想在多個(gè)對(duì)象間共享實(shí)現(xiàn)(可能使用引用計(jì)數(shù)),但同時(shí)要求客戶(hù)并不知道這一點(diǎn)。
8.Composite(組合)
sDV28資訊網(wǎng)——每日最新資訊28at.com
思路:將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)。C o m p o s i t e 使得用戶(hù)對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。sDV28資訊網(wǎng)——每日最新資訊28at.com
應(yīng)用場(chǎng)景:sDV28資訊網(wǎng)——每日最新資訊28at.com
- 你想表示對(duì)象的部分-整體層次結(jié)構(gòu)。
- 你希望用戶(hù)忽略組合對(duì)象與單個(gè)對(duì)象的不同,用戶(hù)將統(tǒng)一地使用組合結(jié)構(gòu)中的所有對(duì)象。
9.Decorator(裝飾)
sDV28資訊網(wǎng)——每日最新資訊28at.com
思路:動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)。就增加功能來(lái)說(shuō),Decorator 模式相比生成子類(lèi)更為靈活。sDV28資訊網(wǎng)——每日最新資訊28at.com
應(yīng)用場(chǎng)景:sDV28資訊網(wǎng)——每日最新資訊28at.com
- 在不影響其他對(duì)象的情況下,以動(dòng)態(tài)、透明的方式給單個(gè)對(duì)象添加職責(zé)。
- 處理那些可以回退的職責(zé)。
- 當(dāng)不能采用生成子類(lèi)的方法進(jìn)行擴(kuò)充時(shí)。一種情況是,可能有大量獨(dú)立的擴(kuò)展,為支持每一種組合將產(chǎn)生大量的子類(lèi),使得子類(lèi)數(shù)目呈爆炸性增長(zhǎng)。另一種情況可能是因?yàn)轭?lèi)定義被隱藏,或類(lèi)定義不能用于生成子類(lèi)。
10.Facade(外觀)
sDV28資訊網(wǎng)——每日最新資訊28at.com
思路:為子系統(tǒng)中的一組接口提供一個(gè)一致的界面,F(xiàn)acade模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用。sDV28資訊網(wǎng)——每日最新資訊28at.com
應(yīng)用場(chǎng)景:sDV28資訊網(wǎng)——每日最新資訊28at.com
- 當(dāng)我們要為一個(gè)復(fù)雜子系統(tǒng)提供一個(gè)簡(jiǎn)單接口時(shí)。子系統(tǒng)往往因?yàn)椴粩嘌莼兊迷絹?lái)越復(fù)雜。大多數(shù)模式使用時(shí)都會(huì)產(chǎn)生更多更小的類(lèi)。這使得子系統(tǒng)更具可重用性,也更容易對(duì)子系統(tǒng)進(jìn)行定制,但這也給那些不需要定制子系統(tǒng)的用戶(hù)帶來(lái)一些使用上的困難。Facade 可以提供一個(gè)簡(jiǎn)單的缺省視圖,這一視圖對(duì)大多數(shù)用戶(hù)來(lái)說(shuō)已經(jīng)足夠,而那些需要更多的可定制性的用戶(hù)可以越過(guò)facade層。
- 客戶(hù)程序與抽象類(lèi)的實(shí)現(xiàn)部分之間存在著很大的依賴(lài)性。引入facade 將這個(gè)子系統(tǒng)與客戶(hù)以及其他的子系統(tǒng)分離,可以提高子系統(tǒng)的獨(dú)立性和可移植性。
- 當(dāng)我們需要構(gòu)建一個(gè)層次結(jié)構(gòu)的子系統(tǒng)時(shí),使用facade模式定義子系統(tǒng)中每層的入口點(diǎn)。如果子系統(tǒng)之間是相互依賴(lài)的,你可以讓它們僅通過(guò)facade進(jìn)行通訊,從而簡(jiǎn)化了它們之間的依賴(lài)關(guān)系。
11.Flyweight(享元)
sDV28資訊網(wǎng)——每日最新資訊28at.com
思路:運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對(duì)象。sDV28資訊網(wǎng)——每日最新資訊28at.com
應(yīng)用場(chǎng)景:sDV28資訊網(wǎng)——每日最新資訊28at.com
- 一個(gè)應(yīng)用程序加載了大量的對(duì)象,造成很大的存儲(chǔ)開(kāi)銷(xiāo)。
- 對(duì)象的大多數(shù)狀態(tài)都可變?yōu)橥獠繝顟B(tài)。
- 如果刪除對(duì)象的外部狀態(tài),那么可以用相對(duì)較少的共享對(duì)象取代很多組對(duì)象。
- 應(yīng)用程序不依賴(lài)于對(duì)象標(biāo)識(shí)。由于Flyweight 對(duì)象可以被共享,對(duì)于概念上明顯有別的對(duì)象,標(biāo)識(shí)測(cè)試將返回真值。
12.Proxy(代理)
sDV28資訊網(wǎng)——每日最新資訊28at.com
思路:為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。sDV28資訊網(wǎng)——每日最新資訊28at.com
應(yīng)用場(chǎng)景:sDV28資訊網(wǎng)——每日最新資訊28at.com
- 在需要用比較通用和復(fù)雜的對(duì)象指針代替簡(jiǎn)單的指針的時(shí)候,使用Proxy模式。下面是一 些可以使用Proxy模式常見(jiàn)情況:
- 遠(yuǎn)程代理(Remote Proxy )為一個(gè)對(duì)象在不同的地址空間提供局部代表。NEXTSTEP[Add94] 使用NXProxy 類(lèi)實(shí)現(xiàn)了這一目的。Coplien[Cop92] 稱(chēng)這種代理為“大使” (Ambassador )。
- 虛代理(Virtual Proxy )根據(jù)需要?jiǎng)?chuàng)建開(kāi)銷(xiāo)很大的對(duì)象。在動(dòng)機(jī)一節(jié)描述的ImageProxy 就是這樣一種代理的例子。
- 保護(hù)代理(Protection Proxy )控制對(duì)原始對(duì)象的訪問(wèn)。保護(hù)代理用于具有不同的訪問(wèn)權(quán)限的對(duì)象。例如,在Choices 操作系統(tǒng)[ CIRM93]中KemelProxies為操作系統(tǒng)對(duì)象提供 了訪問(wèn)保護(hù)。
- 智能指引(Smart Reference )取代了簡(jiǎn)單的指針,它在訪問(wèn)對(duì)象時(shí)執(zhí)行一些附加操作。它的典型用途包括:
- 對(duì)指向?qū)嶋H對(duì)象的引用計(jì)數(shù),這樣當(dāng)該對(duì)象沒(méi)有引用時(shí),可以自動(dòng)釋放它(也稱(chēng)為SmartPointers)。
- 當(dāng)?shù)谝淮我靡粋€(gè)持久對(duì)象時(shí),將它裝入內(nèi)存。
- 在訪問(wèn)一個(gè)實(shí)際對(duì)象前,檢查是否已經(jīng)鎖定了它,以確保其他對(duì)象不能改變它。
三、行為型
13.Interpreter(解釋器)
sDV28資訊網(wǎng)——每日最新資訊28at.com
思路:給定一個(gè)語(yǔ)言,定義它的文法的一種表示,并定義一個(gè)解釋器,這個(gè)解釋器使用該表示來(lái)解釋語(yǔ)言中的句子。sDV28資訊網(wǎng)——每日最新資訊28at.com
應(yīng)用場(chǎng)景:sDV28資訊網(wǎng)——每日最新資訊28at.com
- 當(dāng)有一個(gè)語(yǔ)言需要解釋執(zhí)行, 并且你可將該語(yǔ)言中的句子表示為一個(gè)抽象語(yǔ)法樹(shù)時(shí),可使用解釋器模式。而當(dāng)存在以下情況時(shí)該模式效果最好:
- 該文法簡(jiǎn)單對(duì)于復(fù)雜的文法, 文法的類(lèi)層次變得龐大而無(wú)法管理。此時(shí)語(yǔ)法分析程序生成器這樣的工具是更好的選擇。它們無(wú)需構(gòu)建抽象語(yǔ)法樹(shù)即可解釋表達(dá)式, 這樣可以節(jié)省空間而且還可能節(jié)省時(shí)間。
- 效率不是一個(gè)關(guān)鍵問(wèn)題最高效的解釋器通常不是通過(guò)直接解釋語(yǔ)法分析樹(shù)實(shí)現(xiàn)的, 而是首先將它們轉(zhuǎn)換成另一種形式。例如,正則表達(dá)式通常被轉(zhuǎn)換成狀態(tài)機(jī)。但即使在這種情況下, 轉(zhuǎn)換器仍可用解釋器模式實(shí)現(xiàn),該模式仍是有用的。
14.Template Method(模板方法)
sDV28資訊網(wǎng)——每日最新資訊28at.com
思路:定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類(lèi)中。TemplateMethod 使得子類(lèi)可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。sDV28資訊網(wǎng)——每日最新資訊28at.com
應(yīng)用場(chǎng)景:sDV28資訊網(wǎng)——每日最新資訊28at.com
- 一次性實(shí)現(xiàn)一個(gè)算法的不變的部分,并將可變的行為留給子類(lèi)來(lái)實(shí)現(xiàn)。
- 各子類(lèi)中公共的行為應(yīng)被提取出來(lái)并集中到一個(gè)公共父類(lèi)中以避免代碼重復(fù)。
15.Chain of Responsibility(責(zé)任鏈)
sDV28資訊網(wǎng)——每日最新資訊28at.com
思路:使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免請(qǐng)求的發(fā)送者和接收者之間的耦合關(guān)系。將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞該請(qǐng)求,直到有一個(gè)對(duì)象處理它為止。sDV28資訊網(wǎng)——每日最新資訊28at.com
應(yīng)用場(chǎng)景:sDV28資訊網(wǎng)——每日最新資訊28at.com
- 有多個(gè)的對(duì)象可以處理一個(gè)請(qǐng)求,哪個(gè)對(duì)象處理該請(qǐng)求運(yùn)行時(shí)刻自動(dòng)確定。
- 想在不明確指定接收者的情況下,向多個(gè)對(duì)象中的一個(gè)提交一個(gè)請(qǐng)求。
- 可用于動(dòng)態(tài)指定一個(gè)請(qǐng)求的對(duì)象集合。
16.Command(命令)
sDV28資訊網(wǎng)——每日最新資訊28at.com
思路:將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而使你可用不同的請(qǐng)求對(duì)客戶(hù)進(jìn)行參數(shù)化;對(duì)請(qǐng)求排隊(duì)或記錄請(qǐng)求日志,以及支持可撤消的操作。sDV28資訊網(wǎng)——每日最新資訊28at.com
應(yīng)用場(chǎng)景:sDV28資訊網(wǎng)——每日最新資訊28at.com
- 抽象出待執(zhí)行的動(dòng)作以參數(shù)化某對(duì)象,你可用過(guò)程語(yǔ)言中的回調(diào)(call back)函數(shù)表達(dá)這種參數(shù)化機(jī)制。所謂回調(diào)函數(shù)是指函數(shù)先在某處注冊(cè),而它將在稍后某個(gè)需要的時(shí)候被調(diào)用。Command 模式是回調(diào)機(jī)制的一個(gè)面向?qū)ο蟮奶娲贰?/li>
- 在不同的時(shí)刻定義、排列、執(zhí)行請(qǐng)求。一個(gè)Command對(duì)象可以有一個(gè)與初始請(qǐng)求無(wú)關(guān)的生存期。如果一個(gè)請(qǐng)求的接收者可用一種與地址空間無(wú)關(guān)的方式表達(dá),那么就可將負(fù)責(zé)該請(qǐng)求的命令對(duì)象傳送給另一個(gè)不同的進(jìn)程并在那兒實(shí)現(xiàn)該請(qǐng)求。
- 支持取消操作。Command的Excute 操作可在實(shí)施操作前將狀態(tài)存儲(chǔ)起來(lái),在取消操作時(shí)這個(gè)狀態(tài)用來(lái)消除該操作的影響。Command 接口必須添加一個(gè)Unexecute操作,該操作取消上一次Execute調(diào)用的效果。執(zhí)行的命令被存儲(chǔ)在一個(gè)歷史列表中。可通過(guò)向后和向前遍歷這一列表并分別調(diào)用Unexecute和Execute來(lái)實(shí)現(xiàn)重?cái)?shù)不限的“取消”和“重做”。
- 支持修改日志,這樣當(dāng)系統(tǒng)崩潰時(shí),這些修改可以被重做一遍。在Command接口中添加裝載操作和存儲(chǔ)操作,可以用來(lái)保持變動(dòng)的一個(gè)一致的修改日志。從崩潰中恢復(fù)的過(guò)程包括從磁盤(pán)中重新讀入記錄下來(lái)的命令并用Execute操作重新執(zhí)行它們。
- 用于在原始操作上構(gòu)造一個(gè)更高層高的操作。這樣一種結(jié)構(gòu)在支持事務(wù)( transaction)的信息系統(tǒng)中很常見(jiàn)。一個(gè)事務(wù)封裝了對(duì)數(shù)據(jù)的一組變動(dòng)。Command模式提供了對(duì)事務(wù)進(jìn)行建模的方法。Command有一個(gè)公共的接口,使得你可以用同一種方式調(diào)用所有的事務(wù)。同時(shí)使用該模式也易于添加新事務(wù)以擴(kuò)展系統(tǒng)。
17.Iterator(迭代器)
sDV28資訊網(wǎng)——每日最新資訊28at.com
思路:提供一種方法順序訪問(wèn)一個(gè)聚合對(duì)象中各個(gè)元素, 而又不需暴露該對(duì)象的內(nèi)部表示。sDV28資訊網(wǎng)——每日最新資訊28at.com
應(yīng)用場(chǎng)景:sDV28資訊網(wǎng)——每日最新資訊28at.com
- 訪問(wèn)一個(gè)聚合對(duì)象的內(nèi)容而無(wú)需暴露它的內(nèi)部表示。
- 支持對(duì)聚合對(duì)象的多種遍歷方法。
- 為遍歷不同的聚合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口(支持多態(tài)迭代)。
18.Mediator(中介者)
sDV28資訊網(wǎng)——每日最新資訊28at.com
思路:用一個(gè)中介對(duì)象來(lái)封裝一系列的對(duì)象交互。中介者使各對(duì)象不需要顯式地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互。sDV28資訊網(wǎng)——每日最新資訊28at.com
應(yīng)用場(chǎng)景:sDV28資訊網(wǎng)——每日最新資訊28at.com
- 一組對(duì)象以定義良好但是復(fù)雜的方式進(jìn)行通信。產(chǎn)生的相互依賴(lài)關(guān)系結(jié)構(gòu)混亂且難以理解。
- 一個(gè)對(duì)象引用其他很多對(duì)象并且直接與這些對(duì)象通信,導(dǎo)致難以復(fù)用該對(duì)象。
- 想定制一個(gè)分布在多個(gè)類(lèi)中的行為,而又不想生成太多的子類(lèi)。
19.Memento(備忘錄)
sDV28資訊網(wǎng)——每日最新資訊28at.com
思路:在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)。這樣以后就可將該對(duì)象恢復(fù)到原先保存的狀態(tài)。sDV28資訊網(wǎng)——每日最新資訊28at.com
應(yīng)用場(chǎng)景:sDV28資訊網(wǎng)——每日最新資訊28at.com
- 必須保存一個(gè)對(duì)象在某一個(gè)時(shí)刻的(部分)狀態(tài), 這樣以后需要時(shí)它才能恢復(fù)到先前的狀態(tài)。
- 如果一個(gè)用接口來(lái)讓其它對(duì)象直接得到這些狀態(tài),將會(huì)暴露對(duì)象的實(shí)現(xiàn)細(xì)節(jié)并破壞對(duì)象的封裝性。
20.Observer(觀察者)
sDV28資訊網(wǎng)——每日最新資訊28at.com
思路:定義對(duì)象間的一種一對(duì)多的依賴(lài)關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí), 所有依賴(lài)于它的對(duì)象都得到通知并被自動(dòng)更新。sDV28資訊網(wǎng)——每日最新資訊28at.com
應(yīng)用場(chǎng)景:sDV28資訊網(wǎng)——每日最新資訊28at.com
- 當(dāng)一個(gè)抽象模型有兩個(gè)方面, 其中一個(gè)方面依賴(lài)于另一方面。將這二者封裝在獨(dú)立的對(duì)象中以使它們可以各自獨(dú)立地改變和復(fù)用。
- 當(dāng)對(duì)一個(gè)對(duì)象的改變需要同時(shí)改變其它對(duì)象, 而不知道具體有多少對(duì)象有待改變。
- 當(dāng)一個(gè)對(duì)象必須通知其它對(duì)象,而它又不能假定其它對(duì)象是誰(shuí)。換言之, 你不希望這些對(duì)象是緊密耦合的。
21.State(狀態(tài))
sDV28資訊網(wǎng)——每日最新資訊28at.com
思路:允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為。對(duì)象看起來(lái)似乎修改了它的類(lèi)。sDV28資訊網(wǎng)——每日最新資訊28at.com
應(yīng)用場(chǎng)景:sDV28資訊網(wǎng)——每日最新資訊28at.com
- 一個(gè)對(duì)象的行為取決于它的狀態(tài), 并且它必須在運(yùn)行時(shí)刻根據(jù)狀態(tài)改變它的行為。
- 一個(gè)操作中含有龐大的多分支的條件語(yǔ)句,且這些分支依賴(lài)于該對(duì)象的狀態(tài)。這個(gè)狀態(tài)通常用一個(gè)或多個(gè)枚舉常量表示。通常, 有多個(gè)操作包含這一相同的條件結(jié)構(gòu)。State模式將每一個(gè)條件分支放入一個(gè)獨(dú)立的類(lèi)中。這使得你可以根據(jù)對(duì)象自身的情況將對(duì)象的狀態(tài)作為一個(gè)對(duì)象,這一對(duì)象可以不依賴(lài)于其他對(duì)象而獨(dú)立變化。
22.Strategy(策略)
sDV28資訊網(wǎng)——每日最新資訊28at.com
思路:定義一系列的算法,把它們一個(gè)個(gè)封裝起來(lái), 并且使它們可相互替換。本模式使得算法可獨(dú)立于使用它的客戶(hù)而變化。sDV28資訊網(wǎng)——每日最新資訊28at.com
應(yīng)用場(chǎng)景:sDV28資訊網(wǎng)——每日最新資訊28at.com
- 許多相關(guān)的類(lèi)僅僅是行為有異。“策略”提供了一種用多個(gè)行為中的一個(gè)行為來(lái)配置一個(gè)類(lèi)的方法。
- 需要使用一個(gè)算法的不同變體。例如,你可能會(huì)定義一些反映不同的空間/時(shí)間權(quán)衡的算法。當(dāng)這些變體實(shí)現(xiàn)為一個(gè)算法的類(lèi)層次時(shí) ,可以使用策略模式。
- 算法使用客戶(hù)不應(yīng)該知道的數(shù)據(jù)。可使用策略模式以避免暴露復(fù)雜的、與算法相關(guān)的數(shù)據(jù)結(jié)構(gòu)。
- 一個(gè)類(lèi)定義了多種行為, 并且這些行為在這個(gè)類(lèi)的操作中以多個(gè)條件語(yǔ)句的形式出現(xiàn)。將相關(guān)的條件分支移入它們各自的Strategy類(lèi)中以代替這些條件語(yǔ)句。
23.Visitor(訪問(wèn)者)
sDV28資訊網(wǎng)——每日最新資訊28at.com
思路:定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類(lèi)中。TemplateMethod 使得子類(lèi)可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。sDV28資訊網(wǎng)——每日最新資訊28at.com
應(yīng)用場(chǎng)景:sDV28資訊網(wǎng)——每日最新資訊28at.com
- 一次性實(shí)現(xiàn)一個(gè)算法的不變的部分,并將可變的行為留給子類(lèi)來(lái)實(shí)現(xiàn)。
- 各子類(lèi)中公共的行為應(yīng)被提取出來(lái)并集中到一個(gè)公共父類(lèi)中以避免代碼重復(fù)。
本文鏈接:http://www.tebozhan.com/showinfo-26-14345-0.html23種軟件設(shè)計(jì)模式綜述
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com
上一篇: 圖形編輯器開(kāi)發(fā):實(shí)現(xiàn)縮放圖形
下一篇: ?猜想生成式 AI 對(duì)軟件工程的影響