亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

深入淺出23種設計模式

2020-01-24 01:30:07
字體:
來源:轉載
供稿:網友

創建型

1. Factory Method(工廠方法)

意圖:

定義一個用于創建對象的接口,讓子類決定實例化哪一個類。Factory Method 使一個類的實例化延遲到其子類。

適用性:

當一個類不知道它所必須創建的對象的類的時候。

當一個類希望由它的子類來指定它所創建的對象的時候。

當類將創建對象的職責委托給多個幫助子類中的某一個,并且你希望將哪一個幫助子類是代理者這一信息局部化的時候。

2. Abstract Factory(抽象工廠)

意圖:

提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。

適用性:

一個系統要獨立于它的產品的創建、組合和表示時。

一個系統要由多個產品系列中的一個來配置時。

當你要強調一系列相關的產品對象的設計以便進行聯合使用時。

當你提供一個產品類庫,而只想顯示它們的接口而不是實現時。

3. Builder(建造者)

意圖:

將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。

適用性:

當創建復雜對象的算法應該獨立于該對象的組成部分以及它們的裝配方式時。

當構造過程必須允許被構造的對象有不同的表示時。

4. Prototype(原型)

意圖:

用原型實例指定創建對象的種類,并且通過拷貝這些原型創建新的對象。

適用性:

當要實例化的類是在運行時刻指定時,例如,通過動態裝載;或者

為了避免創建一個與產品類層次平行的工廠類層次時;或者

當一個類的實例只能有幾個不同狀態組合中的一種時。建立相應數目的原型并克隆它們可能比每次用合適的狀態手工實例化該類更方便一些。

5. Singleton(單例)

意圖:

保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。

適用性:

當類只能有一個實例而且客戶可以從一個眾所周知的訪問點訪問它時。

當這個唯一實例應該是通過子類化可擴展的,并且客戶應該無需更改代碼就能使用一個擴展的實例時。

結構型

6. Adapter Class/Object(適配器)

意圖:

將一個類的接口轉換成客戶希望的另外一個接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。

適用性:

你想使用一個已經存在的類,而它的接口不符合你的需求。

你想創建一個可以復用的類,該類可以與其他不相關的類或不可預見的類(即那些接口可能不一定兼容的類)協同工作。

(僅適用于對象Adapter )你想使用一些已經存在的子類,但是不可能對每一個都進行子類化以匹配它們的接口。對象適配器可以適配它的父類接口。

7. Bridge(橋接)

意圖:

將抽象部分與它的實現部分分離,使它們都可以獨立地變化。

適用性:

你不希望在抽象和它的實現部分之間有一個固定的綁定關系。例如這種情況可能是因為,在程序運行時刻實現部分應可以被選擇或者切換。

類的抽象以及它的實現都應該可以通過生成子類的方法加以擴充。這時Bridge 模式使你可以對不同的抽象接口和實現部分進行組合,并分別對它們進行擴充。

對一個抽象的實現部分的修改應對客戶不產生影響,即客戶的代碼不必重新編譯。

(C++)你想對客戶完全隱藏抽象的實現部分。在C++中,類的表示在類接口中是可見的。

有許多類要生成。這樣一種類層次結構說明你必須將一個對象分解成兩個部分。Rumbaugh 稱這種類層次結構為“嵌套的普化”(nested generalizations )。

你想在多個對象間共享實現(可能使用引用計數),但同時要求客戶并不知道這一點。一個簡單的例子便是Coplien 的String 類[ Cop92 ],在這個類中多個對象可以共享同一個字符串表示(StringRep )。

8. Composite(組合)

意圖:

將對象組合成樹形結構以表示“部分-整體”的層次結構。C o m p o s i t e 使得用戶對單個對象和組合對象的使用具有一致性。

適用性:

你想表示對象的部分-整體層次結構。

你希望用戶忽略組合對象與單個對象的不同,用戶將統一地使用組合結構中的所有對象。

9. Decorator(裝飾)

意圖:

動態地給一個對象添加一些額外的職責。就增加功能來說,Decorator 模式相比生成子類更為靈活。

適用性:

在不影響其他對象的情況下,以動態、透明的方式給單個對象添加職責。

處理那些可以撤消的職責。

當不能采用生成子類的方法進行擴充時。一種情況是,可能有大量獨立的擴展,為支持每一種組合將產生大量的子類,使得子類數目呈爆炸性增長。另一種情況可能是因為類定義被隱藏,或類定義不能用于生成子類。

10. Facade(外觀)

意圖:

為子系統中的一組接口提供一個一致的界面,Facade模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。

適用性:

當你要為一個復雜子系統提供一個簡單接口時。子系統往往因為不斷演化而變得越來越復雜。大多數模式使用時都會產生更多更小的類。這使得子系統更具可重用性,也更容易對子系統進行定制,但這也給那些不需要定制子系統的用戶帶來一些使用上的困難。Facade 可以提供一個簡單的缺省視圖,這一視圖對大多數用戶來說已經足夠,而那些需要更多的可定制性的用戶可以越過facade層。

客戶程序與抽象類的實現部分之間存在著很大的依賴性。引入facade 將這個子系統與客戶以及其他的子系統分離,可以提高子系統的獨立性和可移植性。

當你需要構建一個層次結構的子系統時,使用facade模式定義子系統中每層的入口點。如果子系統之間是相互依賴的,你可以讓它們僅通過facade進行通訊,從而簡化了它們之間的依賴關系。

11. Flyweight(享元)

意圖:

運用共享技術有效地支持大量細粒度的對象。

適用性:

一個應用程序使用了大量的對象。

完全由于使用大量的對象,造成很大的存儲開銷。

對象的大多數狀態都可變為外部狀態。

如果刪除對象的外部狀態,那么可以用相對較少的共享對象取代很多組對象。

應用程序不依賴于對象標識。由于Flyweight 對象可以被共享,對于概念上明顯有別的對象,標識測試將返回真值。

12. Proxy(代理)

意圖:

為其他對象提供一種代理以控制對這個對象的訪問。

適用性:

在需要用比較通用和復雜的對象指針代替簡單的指針的時候,使用Proxy模式。下面是一 些可以使用Proxy 模式常見情況:

1) 遠程代理(Remote Proxy )為一個對象在不同的地址空間提供局部代表。 NEXTSTEP[Add94] 使用NXProxy 類實現了這一目的。Coplien[Cop92] 稱這種代理為“大使” (Ambassador )。

2 )虛代理(Virtual Proxy )根據需要創建開銷很大的對象。在動機一節描述的ImageProxy 就是這樣一種代理的例子。

3) 保護代理(Protection Proxy )控制對原始對象的訪問。保護代理用于對象應該有不同 的訪問權限的時候。例如,在Choices 操作系統[ CIRM93]中KemelProxies為操作系統對象提供 了訪問保護。

4 )智能指引(Smart Reference )取代了簡單的指針,它在訪問對象時執行一些附加操作。 它的典型用途包括:

對指向實際對象的引用計數,這樣當該對象沒有引用時,可以自動釋放它(也稱為SmartPointers[Ede92 ] )。

當第一次引用一個持久對象時,將它裝入內存。

在訪問一個實際對象前,檢查是否已經鎖定了它,以確保其他對象不能改變它。

行為型

13. Interpreter(解釋器)

意圖:

給定一個語言,定義它的文法的一種表示,并定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。

適用性:

當有一個語言需要解釋執行, 并且你可將該語言中的句子表示為一個抽象語法樹時,可使用解釋器模式。而當存在以下情況時該模式效果最好:

該文法簡單對于復雜的文法, 文法的類層次變得龐大而無法管理。此時語法分析程序生成器這樣的工具是更好的選擇。它們無需構建抽象語法樹即可解釋表達式, 這樣可以節省空間而且還可能節省時間。

效率不是一個關鍵問題最高效的解釋器通常不是通過直接解釋語法分析樹實現的, 而是首先將它們轉換成另一種形式。例如,正則表達式通常被轉換成狀態機。但即使在這種情況下, 轉換器仍可用解釋器模式實現, 該模式仍是有用的。

14. Template Method(模板方法)

意圖:

定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。TemplateMethod 使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。

適用性:

一次性實現一個算法的不變的部分,并將可變的行為留給子類來實現。

各子類中公共的行為應被提取出來并集中到一個公共父類中以避免代碼重復。這是Opdyke 和Johnson 所描述過的“重分解以一般化”的一個很好的例子[ OJ93 ]。首先識別現有代碼中的不同之處,并且將不同之處分離為新的操作。最后,用一個調用這些新的操作的模板方法來替換這些不同的代碼。

控制子類擴展。模板方法只在特定點調用“hook ”操作(參見效果一節),這樣就只允許在這些點進行擴展。

15. Chain of Responsibility(責任鏈)

意圖:

使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關系。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它為止。

適用性:

有多個的對象可以處理一個請求,哪個對象處理該請求運行時刻自動確定。

你想在不明確指定接收者的情況下,向多個對象中的一個提交一個請求。

可處理一個請求的對象集合應被動態指定。

16. Command(命令)

意圖:

將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日志,以及支持可撤消的操作。

適用性:

抽象出待執行的動作以參數化某對象,你可用過程語言中的回調(call back)函數表達這種參數化機制。所謂回調函數是指函數先在某處注冊,而它將在稍后某個需要的時候被調用。Command 模式是回調機制的一個面向對象的替代品。

在不同的時刻指定、排列和執行請求。一個Command對象可以有一個與初始請求無關的生存期。如果一個請求的接收者可用一種與地址空間無關的方式表達,那么就可將負責該請求的命令對象傳送給另一個不同的進程并在那兒實現該請求。

支持取消操作。Command的Excute 操作可在實施操作前將狀態存儲起來,在取消操作時這個狀態用來消除該操作的影響。Command 接口必須添加一個Unexecute操作,該操作取消上一次Execute調用的效果。執行的命令被存儲在一個歷史列表中。可通過向后和向前遍歷這一列表并分別調用Unexecute和Execute來實現重數不限的“取消”和“重做”。

支持修改日志,這樣當系統崩潰時,這些修改可以被重做一遍。在Command接口中添加裝載操作和存儲操作,可以用來保持變動的一個一致的修改日志。從崩潰中恢復的過程包括從磁盤中重新讀入記錄下來的命令并用Execute操作重新執行它們。

用構建在原語操作上的高層操作構造一個系統。這樣一種結構在支持事務( transaction)的信息系統中很常見。一個事務封裝了對數據的一組變動。Command模式提供了對事務進行建模的方法。Command有一個公共的接口,使得你可以用同一種方式調用所有的事務。同時使用該模式也易于添加新事務以擴展系統。

17. Iterator(迭代器)

意圖:

提供一種方法順序訪問一個聚合對象中各個元素, 而又不需暴露該對象的內部表示。

適用性:

訪問一個聚合對象的內容而無需暴露它的內部表示。

支持對聚合對象的多種遍歷。

為遍歷不同的聚合結構提供一個統一的接口(即, 支持多態迭代)。

18. Mediator(中介者)

意圖:

用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。

適用性:

一組對象以定義良好但是復雜的方式進行通信。產生的相互依賴關系結構混亂且難以理解。

一個對象引用其他很多對象并且直接與這些對象通信,導致難以復用該對象。

想定制一個分布在多個類中的行為,而又不想生成太多的子類。

19. Memento(備忘錄)

意圖:

在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。這樣以后就可將該對象恢復到原先保存的狀態。

適用性:

必須保存一個對象在某一個時刻的(部分)狀態, 這樣以后需要時它才能恢復到先前的狀態。

如果一個用接口來讓其它對象直接得到這些狀態,將會暴露對象的實現細節并破壞對象的封裝性。

20. Observer(觀察者)

意圖:

定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時, 所有依賴于它的對象都得到通知并被自動更新。

適用性:

當一個抽象模型有兩個方面, 其中一個方面依賴于另一方面。將這二者封裝在獨立的對象中以使它們可以各自獨立地改變和復用。

當對一個對象的改變需要同時改變其它對象, 而不知道具體有多少對象有待改變。

當一個對象必須通知其它對象,而它又不能假定其它對象是誰。換言之, 你不希望這些對象是緊密耦合的。

21. State(狀態)

意圖:

允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改了它的類。

適用性:

一個對象的行為取決于它的狀態, 并且它必須在運行時刻根據狀態改變它的行為。

一個操作中含有龐大的多分支的條件語句,且這些分支依賴于該對象的狀態。這個狀態通常用一個或多個枚舉常量表示。通常, 有多個操作包含這一相同的條件結構。State模式將每一個條件分支放入一個獨立的類中。這使得你可以根據對象自身的情況將對象的狀態作為一個對象,這一對象可以不依賴于其他對象而獨立變化。

22. Strategy(策略)

意圖:

定義一系列的算法,把它們一個個封裝起來, 并且使它們可相互替換。本模式使得算法可獨立于使用它的客戶而變化。

適用性:

許多相關的類僅僅是行為有異?!安呗浴碧峁┝艘环N用多個行為中的一個行為來配置一個類的方法。

需要使用一個算法的不同變體。例如,你可能會定義一些反映不同的空間/時間權衡的算法。當這些變體實現為一個算法的類層次時[H087] ,可以使用策略模式。

算法使用客戶不應該知道的數據。可使用策略模式以避免暴露復雜的、與算法相關的數據結構。

一個類定義了多種行為, 并且這些行為在這個類的操作中以多個條件語句的形式出現。將相關的條件分支移入它們各自的Strategy類中以代替這些條件語句。

23. Visitor(訪問者)

意圖:

定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。TemplateMethod 使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。

適用性:

一次性實現一個算法的不變的部分,并將可變的行為留給子類來實現。

各子類中公共的行為應被提取出來并集中到一個公共父類中以避免代碼重復。這是Opdyke和Johnson所描述過的“重分解以一般化”的一個很好的例子[OJ93]。首先識別現有代碼中的不同之處,并且將不同之處分離為新的操作。最后,用一個調用這些新的操作的模板方法來替換這些不同的代碼。

控制子類擴展。模板方法只在特定點調用“hook ”操作(參見效果一節),這樣就只允許在這些點進行擴展。

全部內容到此為止,希望本文所述對大家今后學習設計模式有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩欧美在线视频| 欧美亚洲在线观看| 久久久久国产精品免费网站| 国产精品综合久久久| 亚洲欧美激情四射在线日| 欧美中文字幕在线视频| 青青草99啪国产免费| 久久久精品美女| 尤物精品国产第一福利三区| 91精品视频在线| 97色在线观看免费视频| 久久久久久九九九| 日韩欧美精品网站| 亚洲精品福利免费在线观看| 欧美性生活大片免费观看网址| 日本精品久久久久影院| 久久国产加勒比精品无码| 久久免费在线观看| 国产免费一区二区三区在线能观看| 亚洲一区二区三区久久| 日韩一区二区精品视频| 成人国产精品一区二区| 亚洲欧美中文另类| 精品色蜜蜜精品视频在线观看| 成人a在线视频| 午夜精品福利电影| 伊人伊成久久人综合网小说| 亚洲激情在线观看视频免费| 最近2019年日本中文免费字幕| 欧美成年人在线观看| 欧美综合国产精品久久丁香| 久久久国产一区二区三区| 日韩中文字幕欧美| 国产午夜精品免费一区二区三区| 国产精品一区二区久久久久| 久国内精品在线| 久久精品久久久久久| 色老头一区二区三区在线观看| 日韩av综合网| 欧美肥老太性生活视频| 欧美日本在线视频中文字字幕| 97在线视频免费观看| 日韩在线观看免费高清| 成人欧美一区二区三区在线湿哒哒| 国产一区二区三区18| 日本免费在线精品| 中文字幕少妇一区二区三区| 懂色av影视一区二区三区| 成人国产精品色哟哟| 午夜精品一区二区三区在线| 欧美国产日韩精品| 91综合免费在线| 欧美精品日韩三级| 日韩免费观看av| 亚洲韩国欧洲国产日产av| 亚洲精品一区二区三区不| 中文字幕日韩免费视频| 欧美精品制服第一页| 国产色婷婷国产综合在线理论片a| 国产91色在线免费| 欧美成人精品在线播放| 成人免费激情视频| 91免费人成网站在线观看18| 欧美体内谢she精2性欧美| 欧美电影电视剧在线观看| 色青青草原桃花久久综合| 91社影院在线观看| 7m精品福利视频导航| 欧美—级a级欧美特级ar全黄| 日韩电影中文字幕| 国产精品久久久久久超碰| 国产精品夫妻激情| 亚洲人成电影网站色…| 日韩免费在线免费观看| 亚洲精品99久久久久| 国产精品久久久久久久7电影| 欧美精品一本久久男人的天堂| 亚洲欧洲日产国产网站| 日韩欧美在线视频| 国产精品久久久久久一区二区| 国产成人在线播放| 国产精品福利片| 欧美国产精品人人做人人爱| 一区二区三区高清国产| 麻豆乱码国产一区二区三区| 日韩电影免费在线观看中文字幕| 亚洲人成欧美中文字幕| 国产91精品网站| 国产69精品久久久久99| 国产成人免费av| 欧美激情视频一区二区三区不卡| 色中色综合影院手机版在线观看| 欧美国产视频日韩| 97久久精品人人澡人人爽缅北| 亚洲精品视频二区| 久久久爽爽爽美女图片| 久久久99久久精品女同性| 欧美电影在线观看完整版| 欧美疯狂性受xxxxx另类| 91精品国产色综合| 日韩av在线免费| 日韩电影网在线| 国产精品天天狠天天看| 日韩视频免费大全中文字幕| 欧美国产在线电影| 欧美专区福利在线| 欧美日本高清视频| 欧美亚洲激情视频| 欧美日韩在线免费| 98精品在线视频| 国产日本欧美在线观看| 日韩男女性生活视频| 一区二区欧美在线| 国产亚洲视频在线观看| 日韩在线小视频| 性色av一区二区咪爱| 裸体女人亚洲精品一区| 国产亚洲精品久久久久久牛牛| 日韩视频免费在线观看| 久久成人一区二区| 久久国产精彩视频| 欧美精品久久久久| 97视频色精品| 久久精品国产亚洲一区二区| 欧美一区亚洲一区| 97精品国产97久久久久久免费| 欧洲美女7788成人免费视频| 成人欧美一区二区三区黑人孕妇| www.久久色.com| 68精品国产免费久久久久久婷婷| 中国china体内裑精亚洲片| 97超视频免费观看| 亚洲国产欧美一区二区三区久久| 国产精品激情自拍| 精品久久久久久久中文字幕| 成人黄色av播放免费| 亚洲综合日韩在线| 国产有码一区二区| 欧美精品久久久久| 久久欧美在线电影| 亚洲成人久久电影| 成人av在线天堂| 欧美精品成人在线| 大胆欧美人体视频| 成人免费在线网址| 日韩精品在线免费| 日韩av在线资源| 欧美精品在线观看91| 欧美日韩国产一区在线| 亚洲人成电影网站| 亚洲精品永久免费| 国产精品99蜜臀久久不卡二区| 色婷婷亚洲mv天堂mv在影片| 91精品国产色综合久久不卡98| 中文字幕在线观看日韩| 久久国产精彩视频| 亚洲片国产一区一级在线观看| 亚洲视频在线播放| 亚洲欧洲在线看| 中文字幕亚洲欧美日韩在线不卡| 亚洲精品日韩激情在线电影| 91在线视频成人| 欧美精品久久久久久久久久| 亚洲国产欧美一区二区三区久久|