攝影 > 設計模式
目錄
No. 1
  設計模式是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。
  毫無疑問,設計模式於己於他人於係統都是多贏的,設計模式使代碼編製真正工程化,設計模式是軟件工程的基石,如同大廈的一塊塊磚石一樣。
  gof(gang of four,指《設計模式-可復用面嚮對象軟件的基礎》的四位作者:erich gamma, richard helm, ralph johnson and john vlissides)的“設計模式”是第一次將設計模式提升到理論高度,並將之規範化,本書提出了23種基本設計模式,自此,在可復用面嚮對象軟件的發展過程中,新的大量的設計模式不斷出現。
  設計模式和框架
  現在,可復用面嚮對象軟件係統現在一般劃分為三大類:應用程序 工具箱和框架(framework),我們平時開發的具體軟件都是應用程序;java的api屬於工具箱;而框架是構成一類特定軟件可復用設計的一組相互協作的類。ejb(enterprise javabeans)是java應用於企業計算的框架.
  框架通常定義了應用體係的整體結構 類和對象的關係等等設計參數,以便於具體應用實現者能集中精力於應用本身的特定細節。框架主要記錄軟件應用中共同的設計决策,框架強調設計復用,因此框架設計中必然要使用設計模式.
  另外,設計模式有助於對框架結構的理解,成熟的框架通常使用了多種設計模式,如果你熟悉這些設計模式,毫無疑問,你將迅速掌握框架的結構,我們一般開發者如果突然接觸ejb j2ee等框架,會覺得特別難學,難掌握,那麽轉而先掌握設計模式,無疑是給了你剖析ejb或j2ee係統的一把利器
  一個模式的四個基本要素
  設計模式使人們可以更加簡單方便地復用成功的設計和體係結構。將已證實的技術表述成設計模式也會使新係統開發者更加容易理解其設計思路。
  1. 模式名稱(pattern name)
  一個助記名,它用一兩個詞來描述模式的問題、解决方案和效果。命名一個新的模式增加了我們的設計詞彙。設計模式允許我們在較高的抽象層次上進行設計。基於一個模式詞彙表,我們自己以及同事之間就可以討論模式並在編寫文檔時使用它們。模式名可以幫助我們思考,便於我們與其他人交流設計思想及設計結果。找到恰當的模式名也是我們設計模式編目工作的難點之一。
  2. 問題(problem)
  描述了應該在何時使用模式。它解釋了設計問題和問題存在的前因後果,它可能描述了特定的設計問題,如怎樣用對象表示算法等。也可能描述了導致不靈活設計的類或對象結構。有時候,問題部分會包括使用模式必須滿足的一係列先决條件。
  3. 解决方案(solution)
  描述了設計的組成成分,它們之間的相互關係及各自的職責和協作方式。因為模式就像一個模板,可應用於多種不同場合,所以解决方案並不描述一個特定而具體的設計或實現,而是提供設計問題的抽象描述和怎樣用一個具有一般意義的元素組合(類或對象組合)來解决這個問題。
  4. 效果(consequences)
  描述了模式應用的效果及使用模式應權衡的問題。儘管我們描述設計决策時,並不總提到模式效果,但它們對於評價設計選擇和理解使用模式的代價及好處具有重要意義。軟件效果大多關註對時間和空間的衡量,它們也表述了語言和實現問題。因為復用是面嚮對象設計的要素之一,所以模式效果包括它對係統的靈活性、擴充性或可移植性的影響,顯式地列出這些效果對理解和評價這些模式很有幫助。
  四種設計模式的作用:
  外觀(facade):為了係統中的一組功能調用提供一個一致的接口,這個接口使得這一子係統更加容易使用;
  裝飾(decorate):當不能采用生成子類的方法進行擴充時,動態地給一個對象添加一些額外的功能;
  單件(singleton):保證一個類僅有一個實例,並提供一個訪問他的全局訪問點;
  模板方法(template method):在方法中定義算法的框架,而將算法中的一些操作步驟延遲到子類中實現。
  模式(pattern)就是做事的一種方法,也即實現某個目標的途徑,或者技術。這種捕獲有效技術的思想可以應用到許多領域當中,比如烹飪、生産焰火製品、開發軟件以及其他一些行業。對於任何一個正邁嚮成熟的行業,人們總會開始尋找一些通用和有效的方法,來達到目標並解决不同場合中的問題。由某個行業的從業人員組成的社區通常會發明一些專業術語,以便於同行之間進行交流。這其中的某些專業術語將稱為模式,即實現特定目標的公認技術。隨着某個行業及其專業術語的發展,一些作者便開始起到重要的作用。他們將某個行業的模式記錄歸檔,參與標準化專業術語,並且公開傳播這些有效的技術。
  christopher alexander是最早將某個行業的最佳實踐記錄為模式的作者之一。他研究的領域是建築(而不是軟件)的架構。其著作a pattern language: towns, buildings, construction[alexander、ishikouwa和silverstein,1977]介紹了成功設計房屋和城鎮的模式。該著作影響深遠,甚至影響到軟件開發行業。該書之所以能夠影響其他行業,部分原因是因為它給出了一種獨特的觀察目標的方式。
  有人可能會認為,應用建築模式的目標就是“設計建築物”。但是alexander在書中明確指出建築模式的目的是服務於建築物和城鎮的主人,並讓他們感到滿意。該書指出模式是獲取和交流行業知識的絶佳途徑。另外,書中還提到,合理地認識並記錄某項工作的目標非常關鍵,需要以哲學觀從整體考慮,並可能面臨難以捉摸的挑戰。
  模式方法引起了軟件社區的共鳴,許多記錄軟件開發模式的圖書已經相繼出版。這些書中記錄了軟件過程、軟件分析、高層軟件架構以及類層次設計的最佳實踐。每年都有這方面的新書面世。如果需要選擇一本有關模式的圖書,那麽你應該先花些時間去瀏覽一下對已出版的這方面圖書的書評,然後再選擇一本能夠最大程度幫助自己的圖書。
定義
  設計模式(Design pattern)是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。
  毫無疑問,設計模式於己於他人於係統都是多贏的,設計模式使代碼編製真正工程化,設計模式是軟件工程的基石,如同大廈的一塊塊磚石一樣。
  GoF(“四人幫”,指Gamma, Helm, Johnson & Vlissides, Addison-Wesley四人)的《設計模式》(1995年出版)是第一次將設計模式提升到理論高度,並將之規範化,本書提出了23種基本設計模式,自此,在可復用面嚮對象軟件的發展過程中,新的大量的設計模式不斷出現。
設計模式和框架
  現在,可復用面嚮對象軟件係統現在一般劃分為三大類:應用程序工具箱和框架(Framework),我們平時開發的具體軟件都是應用程序;Java的API屬於工具箱;而框架是構成一類特定軟件可復用設計的一組相互協作的類。EJB(EnterpriseJavaBeans)是Java應用於企業計算的框架.
  框架通常定義了應用體係的整體結構類和對象的關係等等設計參數,以便於具體應用實現者能集中精力於應用本身的特定細節。框架主要記錄軟件應用中共同的設計决策,框架強調設計復用,因此框架設計中必然要使用設計模式.
  另外,設計模式有助於對框架結構的理解,成熟的框架通常使用了多種設計模式,如果你熟悉這些設計模式,毫無疑問,你將迅速掌握框架的結構,我們一般開發者如果突然接觸EJBJ2EE等框架,會覺得特別難學,難掌握,那麽轉而先掌握設計模式,無疑是給了你剖析EJB或J2EE係統的一把利器。
設計模式的原則
  近年來,大傢都開始註意設計模式。那麽,到底我們為什麽要用設計模式呢?這麽多設計模式為什麽要這麽設計呢?說實話,以前我還真沒搞清楚。就是看大傢一口一個"Design pattern",心就有點發虛。於是就買了本"四人幫"的設計模式,結果看得似懂非懂:看得時候好像是懂了,過一會就忘了。可能是本人比較"愚鈍"吧:))最近,有了點感悟。"獨樂不如衆樂",與大傢分享一下,還望指教!
  為什麽要提倡"Design Pattern"呢?根本原因是為了代碼復用,增加可維護性。那麽怎麽才能實現代碼復用呢?OO界有前輩的幾個原則:"開-閉"原則(Open Closed Principal)、裏氏代換原則、合成復用原則。設計模式就是實現了這些原則,從而達到了代碼復用、增加可維護性的目的。
  1、"開-閉"原則
  此原則是由"Bertrand Meyer"提出的。原文是:"Software entities should be open for extension,but closed for modification"。就是說模塊應對擴展開放,而對修改關閉。模塊應盡量在不修改原(是"原",指原來的代碼)代碼的情況下進行擴展。那麽怎麽擴展呢?我們看工廠模式"factory pattern":假設中關村有一個賣盜版盤和毛片的小子,我們給他設計一"光盤銷售管理軟件"。我們應該先設計一"光盤"接口。如圖:
  [pre]______________
  |<>|
  | 光盤 |
  |_____________|
  |+賣() |
  | |
  |_____________|[/pre]
  而盜版盤和毛片是其子類。小子通過"DiscFactory"來管理這些光盤。代碼為:
  public class DiscFactory{
  public static 光盤 getDisc(java/lang/String.java.html" String name){
  return (光盤)java/lang/Class.java.html" Class.forName(name).getInstance();
  }
  }
  有人要買盜版盤,怎麽實現呢?
  public class 小子{
  public static void main(java/lang/String.java.html" String[] args){
  光盤 d=DiscFactory.getDisc("盜版盤");
  光盤.賣();
  }
  }
  如果有一天,這小子良心發現了,開始賣正版軟件。沒關係,我們衹要再創建一個"光盤"的子類"正版軟件"就可以了。不需要修改原結構和代碼。怎麽樣?對擴展開發,對修改關閉。"開-閉原則"
  工廠模式是對具體産品進行擴展,有的項目可能需要更多的擴展性,要對這個"工廠"也進行擴展,那就成了"抽象工廠模式"。
  2、裏氏代換原則
  裏氏代換原則是由"Barbara Liskov"提出的。如果調用的是父類的話,那麽換成子類也完全可以運行。比如:
  光盤 d=new 盜版盤();
  d.賣();
  現在要將"盜版盤"類改為"毛片"類,沒問題,完全可以運行。Java編譯程序會檢查程序是否符合裏氏代換原則。還記得java繼承的一個原則嗎?子類override方法的訪問權限不能小於父類對應方法的訪問權限。比如"光盤"中的方法"賣"訪問權限是"public",那麽"盜版盤"和"毛片"中的"賣"方法就不能是protected或private,編譯不能通過。為什麽要這樣呢?你想啊:如果"盜版盤"的"賣"方法是private。那麽下面這段代碼就不能執行了:
  光盤 d=new 盜版盤();
  d.賣();
  可以說:裏氏代換原則是繼承復用的一個基礎。
  3、合成復用原則
  就是說要少用繼承,多用合成關係來實現。我曾經這樣寫過程序:有幾個類要與數據庫打交道,就寫了一個數據庫操作的類,然後別的跟數據庫打交道的類都繼承這個。結果後來,我修改了數據庫操作類的一個方法,各個類都需要改動。"牽一發而動全身"!面嚮對象是要把波動限製在盡量小的範圍。
  在Java中,應盡量針對Interface編程,而非實現類。這樣,更換子類不會影響調用它方法的代碼。要讓各個類盡可能少的跟別人聯繫,"不要與陌生人說話"。這樣,城門失火,纔不至於殃及池魚。擴展性和維護性才能提高
  理解了這些原則,再看設計模式,衹是在具體問題上怎麽實現這些原則而已。張無忌學太極拳,忘記了所有招式,打倒了"玄幂二老",所謂"心中無招"。設計模式可謂招數,如果先學通了各種模式,又忘掉了所有模式而隨心所欲,可謂OO之最高境界。呵呵,搞笑,搞笑!(JR)
  4 依賴倒轉原則
  抽象不應該依賴與細節,細節應當依賴與抽象。
  要針對接口編程,而不是針對實現編程。
  傳遞參數,或者在組合聚合關係中,盡量引用層次高的類。
  主要是在構造對象時可以動態的創建各種具體對象,當然如果一些具體類比較穩定,就不必在弄一個抽象類做它的父類,這樣有畫舌添足的感覺
  5 接口隔離原則
  定製服務的例子,每一個接口應該是一種角色,不多不少,不幹不該幹的事,該幹的事都要幹
  6 抽象類
  抽象類不會有實例,一般作為父類為子類繼承,一般包含這個係的共同屬性和方法。
  註意:好的繼承關係中,衹有葉節點是具體類,其他節點應該都是抽象類,也就是說具體類
  是不被繼承的。將盡可能多的共同代碼放到抽象類中。
  7 迪米特法則
  最少知識原則。不要和陌生人說話。
一個模式的四個基本要素
  設計模式使人們可以更加簡單方便地復用成功的設計和體係結構。將已證實的技術表述成設計模式也會使新係統開發者更加容易理解其設計思路。
  1. 模式名稱(pattern name)
  一個助記名,它用一兩個詞來描述模式的問題、解决方案和效果。命名一個新的模式增加了我們的設計詞彙。設計模式允許我們在較高的抽象層次上進行設計。基於一個模式詞彙表,我們自己以及同事之間就可以討論模式並在編寫文檔時使用它們。模式名可以幫助我們思考,便於我們與其他人交流設計思想及設計結果。找到恰當的模式名也是我們設計模式編目工作的難點之一。
  2. 問題(problem)
  描述了應該在何時使用模式。它解釋了設計問題和問題存在的前因後果,它可能描述了特定的設計問題,如怎樣用對象表示算法等。也可能描述了導致不靈活設計的類或對象結構。有時候,問題部分會包括使用模式必須滿足的一係列先决條件。
  3. 解决方案(solution)
  描述了設計的組成成分,它們之間的相互關係及各自的職責和協作方式。因為模式就像一個模板,可應用於多種不同場合,所以解决方案並不描述一個特定而具體的設計或實現,而是提供設計問題的抽象描述和怎樣用一個具有一般意義的元素組合(類或對象組合)來解决這個問題。
  4. 效果(consequences)
  描述了模式應用的效果及使用模式應權衡的問題。儘管我們描述設計决策時,並不總提到模式效果,但它們對於評價設計選擇和理解使用模式的代價及好處具有重要意義。軟件效果大多關註對時間和空間的衡量,它們也表述了語言和實現問題。因為復用是面嚮對象設計的要素之一,所以模式效果包括它對係統的靈活性、擴充性或可移植性的影響,顯式地列出這些效果對理解和評價這些模式很有幫助。
一些基本的設計模式
  Abstract Factory:提供一個創建一係列相關或相互依賴對象的接口,而無需指定它們具體的類。
  Adapter:將一個類的接口轉換成客戶希望的另外一個接口。A d a p t e r模式使得原本由於接口不兼容而不能一起工作的那些類可以一起工作。
  Bridge:將抽象部分與它的實現部分分離,使它們都可以獨立地變化。
  Builder:將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
  Chain of Responsibility:為解除請求的發送者和接收者之間耦合,而使多個對象都有機會處理這個請求。將這些對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有一個對象處理它。
  Command:將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日志,以及支持可取消的操作。
  Composite:將對象組合成樹形結構以表示“部分-整體”的層次結構。它使得客戶對單個對象和復合對象的使用具有一致性。
  Decorator:動態地給一個對象添加一些額外的職責。就擴展功能而言, 它比生成子類方式更為靈活。
  Facade:為子係統中的一組接口提供一個一致的界面, F a c a d e模式定義了一個高層接口,這個接口使得這一子係統更加容易使用。
  Factory Method:定義一個用於創建對象的接口,讓子類决定將哪一個類實例化。Factory Method使一個類的實例化延遲到其子類。
  Flyweight:運用共享技術有效地支持大量細粒度的對象。
  Interpreter:給定一個語言, 定義它的文法的一種表示,並定義一個解釋器, 該解釋器使用該表示來解釋語言中的句子。
  Iterator:提供一種方法順序訪問一個聚合對象中各個元素, 而又不需暴露該對象的內部表示。
  Mediator:用一個中介對象來封裝一係列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的交互。
  Memento:在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態。這樣以後就可將該對象恢復到保存的狀態。
  Observer:定義對象間的一種一對多的依賴關係,以便當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並自動刷新。
  Prototype:用原型實例指定創建對象的種類,並且通過拷貝這個原型來創建新的對象。
  Proxy:為其他對象提供一個代理以控製對這個對象的訪問。
  Singleton:保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。
  State:允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改了它所屬的類。
  Strategy:定義一係列的算法,把它們一個個封裝起來, 並且使它們可相互替換。本模式使得算法的變化可獨立於使用它的客戶。
  Template Method:定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。Template Method使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
  Visitor:表示一個作用於某對象結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。
  創建型 結構型 行為型
  類 Factory Method Adapter_Class Interpreter
  Template Method
  對象 Abstract Factory
  Builder
  Prototype
  Singleton Adapter_Object
  Bridge
  Composite
  Decorator
  Facade
  Flyweight
  Proxy Chain of Responsibility
  Command
  Iterator
  Mediator
  Memento
  Observer
  State
  Strategy
  Visitor
  概覽
  名稱 Factory Method
  結構
  意圖 定義一個用於創建對象的接口,讓子類决定實例化哪一個類。Factory Method 使一個類的實例化延遲到其子類。
  適用性 當一個類不知道它所必須創建的對象的類的時候。
  當一個類希望由它的子類來指定它所創建的對象的時候。
  當類將創建對象的職責委托給多個幫助子類中的某一個,並且你希望將哪一個幫助子類是代理者這一信息局部化的時候。
  名稱 Abstract Factory
  結構
  意圖 提供一個創建一係列相關或相互依賴對象的接口,而無需指定它們具體的類。
  適用性 一個係統要獨立於它的産品的創建、組合和表示時。
  一個係統要由多個産品係列中的一個來配置時。
  當你要強調一係列相關的産品對象的設計以便進行聯合使用時。
  當你提供一個産品類庫,而衹想顯示它們的接口而不是實現時。
  名稱 Builder
  結構
  意圖 將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
  適用性 當創建復雜對象的算法應該獨立於該對象的組成部分以及它們的裝配方式時。
  當構造過程必須允許被構造的對象有不同的表示時。
  名稱 Prototype
  結構
  意圖 用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象。
  適用性 當要實例化的類是在運行時刻指定時,例如,通過動態裝載;或者
  為了避免創建一個與産品類層次平行的工廠類層次時;或者
  當一個類的實例衹能有幾個不同狀態組合中的一種時。建立相應數目的原型並剋隆它們可能比每次用合適的狀態手工實例化該類更方便一些。
  名稱 Singleton
  結構
  意圖 保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。
  適用性 當類衹能有一個實例而且客戶可以從一個衆所周知的訪問點訪問它時。
  當這個唯一實例應該是通過子類化可擴展的,並且客戶應該無需更改代碼就能使用一個擴展的實例時。
  名稱 Adapter
  結構
  意圖 將一個類的接口轉換成客戶希望的另外一個接口。A d a p t e r 模式使得原本由於接口不兼容而不能一起工作的那些類可以一起工作。
  適用性 你想使用一個已經存在的類,而它的接口不符合你的需求。
  你想創建一個可以復用的類,該類可以與其他不相關的類或不可預見的類(即那些接口可能不一定兼容的類)協同工作。
  (僅適用於對象A d a p t e r )你想使用一些已經存在的子類,但是不可能對每一個都進行子類化以匹配它們的接口。對象適配器可以適配它的父類接口。
  名稱 Bridge
  結構
  意圖 將抽象部分與它的實現部分分離,使它們都可以獨立地變化。
  適用性 你不希望在抽象和它的實現部分之間有一個固定的綁定關係。例如這種情況可能是因為,在程序運行時刻實現部分應可以被選擇或者切換。
  類的抽象以及它的實現都應該可以通過生成子類的方法加以擴充。這時B r i d g e 模式使你可以對不同的抽象接口和實現部分進行組合,並分別對它們進行擴充。
  對一個抽象的實現部分的修改應對客戶不産生影響,即客戶的代碼不必重新編譯。
  (C + +)你想對客戶完全隱藏抽象的實現部分。在C + +中,類的表示在類接口中是可見的。
  有許多類要生成。這樣一種類層次結構說明你必須將一個對象分解成兩個部分。R u m b a u g h 稱這種類層次結構為“嵌套的普化”(nested generalizations )。
  你想在多個對象間共享實現(可能使用引用計數),但同時要求客戶並不知道這一點。一個簡單的例子便是C o p l i e n 的S t r i n g 類[ C o p 9 2 ],在這個類中多個對象可以共享同一個字符串表示(S t r i n g R e p )。
  名稱 Composite
  結構
  意圖 將對象組合成樹形結構以表示“部分-整體”的層次結構。C o m p o s i t e 使得用戶對單個對象和組合對象的使用具有一致性。
  適用性 你想表示對象的部分-整體層次結構。
  你希望用戶忽略組合對象與單個對象的不同,用戶將統一地使用組合結構中的所有對象。
  名稱 Decorator
  結構
  意圖 動態地給一個對象添加一些額外的職責。就增加功能來說,D e c o r a t o r 模式相比生成子類更為靈活。
  適用性 在不影響其他對象的情況下,以動態、透明的方式給單個對象添加職責。
  處理那些可以撤消的職責。
  當不能采用生成子類的方法進行擴充時。一種情況是,可能有大量獨立的擴展,為支持每一種組合將産生大量的子類,使得子類數目呈爆炸性增長。另一種情況可能是因為類定義被隱藏,或類定義不能用於生成子類。
  名稱 Facade
  結構
  意圖 為子係統中的一組接口提供一個一致的界面,F a c a d e 模式定義了一個高層接口,這個接口使得這一子係統更加容易使用。
  適用性 當你要為一個復雜子係統提供一個簡單接口時。子係統往往因為不斷演化而變得越來越復雜。大多數模式使用時都會産生更多更小的類。這使得子係統更具可重用性,也更容易對子係統進行定製,但這也給那些不需要定製子係統的用戶帶來一些使用上的睏難。F a c a d e 可以提供一個簡單的缺省視圖,這一視圖對大多數用戶來說已經足夠,而那些需要更多的可定製性的用戶可以越過f a c a d e 層。
  客戶程序與抽象類的實現部分之間存在着很大的依賴性。引入f a c a d e 將這個子係統與客戶以及其他的子係統分離,可以提高子係統的獨立性和可移植性。
  當你需要構建一個層次結構的子係統時,使用f a c a d e 模式定義子係統中每層的入口點。如果子係統之間是相互依賴的,你可以讓它們僅通過f a c a d e 進行通訊,從而簡化了它們之間的依賴關係。
  名稱 Flyweight
  結構
  意圖 運用共享技術有效地支持大量細粒度的對象。
  適用性 一個應用程序使用了大量的對象。
  完全由於使用大量的對象,造成很大的存儲開銷。
  對象的大多數狀態都可變為外部狀態。
  如果刪除對象的外部狀態,那麽可以用相對較少的共享對象取代很多組對象。
  應用程序不依賴於對象標識。由於F l y w e i g h t 對象可以被共享,對於概念上明顯有別的對象,標識測試將返回真值。
  名稱 Proxy
  結構
  意圖 為其他對象提供一種代理以控製對這個對象的訪問。
  適用性 在需要用比較通用和復雜的對象指針代替簡單的指針的時候,使用P r o x y 模式。下面是一 些可以使用P r o x y 模式常見情況:
  1) 遠程代理(Remote Proxy )為一個對象在不同的地址空間提供局部代表。 NEXTSTEP[Add94] 使用N X P r o x y 類實現了這一目的。Coplien[Cop92] 稱這種代理為“大使” (A m b a s s a d o r )。
  2 )虛代理(Virtual Proxy )根據需要創建開銷很大的對象。在動機一節描述的I m a g e P r o x y 就是這樣一種代理的例子。
  3) 保護代理(Protection Proxy )控製對原始對象的訪問。保護代理用於對象應該有不同 的訪問權限的時候。例如,在C h o i c e s 操作係統[ C I R M 9 3 ]中K e m e l P r o x i e s 為操作係統對象提供 了訪問保護。
  4 )智能指引(Smart Reference )取代了簡單的指針,它在訪問對象時執行一些附加操作。 它的典型用途包括:
  對指嚮實際對象的引用計數,這樣當該對象沒有引用時,可以自動釋放它(也稱為S m a r tP o i n t e r s[ E d e 9 2 ] )。
  當第一次引用一個持久對象時,將它裝入內存。
  在訪問一個實際對象前,檢查是否已經鎖定了它,以確保其他對象不能改變它。
  名稱 Chain of Responsibility
  結構
  意圖 使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關係。將這些對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有一個對象處理它為止。
  適用性 有多個的對象可以處理一個請求,哪個對象處理該請求運行時刻自動確定。
  你想在不明確指定接收者的情況下,嚮多個對象中的一個提交一個請求。
  可處理一個請求的對象集合應被動態指定。
  名稱 Command
  結構
  意圖 將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日志,以及支持可撤消的操作。
  適用性 像上面討論的M e n u I t e m 對象那樣,抽象出待執行的動作以參數化某對象。你可用過程語言中的回調(c a l l b a c k )函數表達這種參數化機製。所謂回調函數是指函數先在某處註册,而它將在稍後某個需要的時候被調用。C o m m a n d 模式是回調機製的一個面嚮對象的替代品。
  在不同的時刻指定、排列和執行請求。一個C o m m a n d 對象可以有一個與初始請求無關的生存期。如果一個請求的接收者可用一種與地址空間無關的方式表達,那麽就可將負責該請求的命令對象傳送給另一個不同的進程並在那兒實現該請求。
  支持取消操作。C o m m a n d 的E x c u t e 操作可在實施操作前將狀態存儲起來,在取消操作時這個狀態用來消除該操作的影響。C o m m a n d 接口必須添加一個U n e x e c u t e 操作,該操作取消上一次E x e c u t e 調用的效果。執行的命令被存儲在一個歷史列表中。可通過嚮後和嚮前遍歷這一列表並分別調用U n e x e c u t e 和E x e c u t e 來實現重數不限的“取消”和“重做”。
  支持修改日志,這樣當係統崩潰時,這些修改可以被重做一遍。在C o m m a n d 接口中添加裝載操作和存儲操作,可以用來保持變動的一個一致的修改日志。從崩潰中恢復的過程包括從磁盤中重新讀入記錄下來的命令並用E x e c u t e 操作重新執行它們。
  用構建在原語操作上的高層操作構造一個係統。這樣一種結構在支持事務( t r a n s a c t i o n )的信息係統中很常見。一個事務封裝了對數據的一組變動。C o m m a n d 模式提供了對事務進行建模的方法。C o m m a n d 有一個公共的接口,使得你可以用同一種方式調用所有的事務。同時使用該模式也易於添加新事務以擴展係統。
  名稱 Interpreter
  結構
  意圖 給定一個語言,定義它的文法的一種表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。
  適用性 當有一個語言需要解釋執行, 並且你可將該語言中的句子表示為一個抽象語法樹時,可使用解釋器模式。而當存在以下情況時該模式效果最好:
  該文法簡單對於復雜的文法, 文法的類層次變得龐大而無法管理。此時語法分析程序生成器這樣的工具是更好的選擇。它們無需構建抽象語法樹即可解釋表達式, 這樣可以節省空間而且還可能節省時間。
  效率不是一個關鍵問題最高效的解釋器通常不是通過直接解釋語法分析樹實現的, 而是首先將它們轉換成另一種形式。例如,正則表達式通常被轉換成狀態機。但即使在這種情況下, 轉換器仍可用解釋器模式實現, 該模式仍是有用的。
  名稱 Iterator
  結構
  意圖 提供一種方法順序訪問一個聚合對象中各個元素, 而又不需暴露該對象的內部表示。
  適用性 訪問一個聚合對象的內容而無需暴露它的內部表示。
  支持對聚合對象的多種遍歷。
  為遍歷不同的聚合結構提供一個統一的接口(即, 支持多態迭代)。
  名稱 Mediator
  結構
  意圖 用一個中介對象來封裝一係列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的交互。
  適用性 一組對象以定義良好但是復雜的方式進行通信。産生的相互依賴關係結構混亂且難以理解。
  一個對象引用其他很多對象並且直接與這些對象通信,導致難以復用該對象。
  想定製一個分佈在多個類中的行為,而又不想生成太多的子類。
  名稱 Memento
  結構
  意圖 在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態。這樣以後就可將該對象恢復到原先保存的狀態。
  適用性 必須保存一個對象在某一個時刻的(部分)狀態, 這樣以後需要時它才能恢復到先前的狀態。
  如果一個用接口來讓其它對象直接得到這些狀態,將會暴露對象的實現細節並破壞對象的封裝性。
  名稱 Observer
  結構
  意圖 定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時, 所有依賴於它的對象都得到通知並被自動更新。
  適用性 當一個抽象模型有兩個方面, 其中一個方面依賴於另一方面。將這二者封裝在獨立的對象中以使它們可以各自獨立地改變和復用。
  當對一個對象的改變需要同時改變其它對象, 而不知道具體有多少對象有待改變。
  當一個對象必須通知其它對象,而它又不能假定其它對象是誰。換言之, 你不希望這些對象是緊密耦合的。
  名稱 State
  結構
  意圖 允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改了它的類。
  適用性 一個對象的行為取决於它的狀態, 並且它必須在運行時刻根據狀態改變它的行為。
  一個操作中含有龐大的多分支的條件語句,且這些分支依賴於該對象的狀態。這個狀態通常用一個或多個枚舉常量表示。通常, 有多個操作包含這一相同的條件結構。S t a t e模式將每一個條件分支放入一個獨立的類中。這使得你可以根據對象自身的情況將對象的狀態作為一個對象,這一對象可以不依賴於其他對象而獨立變化。
  名稱 Strategy
  結構
  意圖 定義一係列的算法,把它們一個個封裝起來, 並且使它們可相互替換。本模式使得算法可獨立於使用它的客戶而變化。
  適用性 許多相關的類僅僅是行為有異。“策略”提供了一種用多個行為中的一個行為來配置一個類的方法。
  需要使用一個算法的不同變體。例如,你可能會定義一些反映不同的空間/時間權衡的算法。當這些變體實現為一個算法的類層次時[ H O 8 7 ] ,可以使用策略模式。
  算法使用客戶不應該知道的數據。可使用策略模式以避免暴露復雜的、與算法相關的數據結構。
  一個類定義了多種行為, 並且這些行為在這個類的操作中以多個條件語句的形式出現。將相關的條件分支移入它們各自的S t r a t e g y 類中以代替這些條件語句。
  名稱 Template Method
  結構
  意圖 定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。Te m p l a t e M e t h o d 使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
  適用性 一次性實現一個算法的不變的部分,並將可變的行為留給子類來實現。
  各子類中公共的行為應被提取出來並集中到一個公共父類中以避免代碼重複。這是O p d y k e 和J o h n s o n 所描述過的“重分解以一般化”的一個很好的例子[ O J 9 3 ]。首先識別現有代碼中的不同之處,並且將不同之處分離為新的操作。最後,用一個調用這些新的操作的模板方法來替換這些不同的代碼。
  控製子類擴展。模板方法衹在特定點調用“h o o k ”操作(參見效果一節),這樣就衹允許在這些點進行擴展。
  名稱 Visitor
  結構
  意圖 表示一個作用於某對象結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。
  適用性 一個對象結構包含很多類對象,它們有不同的接口,而你想對這些對象實施一些依賴於其具體類的操作。
  需要對一個對象結構中的對象進行很多不同的並且不相關的操作,而你想避免讓這些操作“污染”這些對象的類。Vi s i t o r 使得你可以將相關的操作集中起來定義在一個類中。當該對象結構被很多應用共享時,用Vi s i t o r 模式讓每個應用僅包含需要用到的操作。
  定義對象結構的類很少改變,但經常需要在此結構上定義新的操作。改變對象結構類需要重定義對所有訪問者的接口,這可能需要很大的代價。如果對象結構類經常改變,那麽可能還是在這些類中定義這些操作較好。
  五、成功采用設計模式的三個步驟
  如何把設計模式的采用和日益臨近的最後期限、緊縮的預算和很多公司現有的有限團隊資源相結合?以下是成功製訂設計模式的三個步驟。
  強大的通信和培訓
  許多機構擁有領先技術,可能正式通過了設計師論壇的論證或者非正式的公認專傢。這些領先廠商將推廣設計模式采用中的開放通信,並將培訓開發具體設計模式的團隊。通信應當跨開發團隊和項目以便預先防止采用竪井和多種惟一的實現(謹記每個Developer/Project AntiPattern的實現)。培訓可以采用正式的internal lunch-and-learns、正式的internal class或者派一些員工參加外部培訓。這些培訓方式將促進正確的設計模式應用程序。如果僅有極少的觀衆能夠參加培訓,最佳的候選人是那些感覺適合在回來後能夠培訓其同事的人。
  設計模式采用指導
  設計模式可用於使項目受益,但是他們也可能因為誤用而對應用程序造成損害。應當鼓勵采用他們,但是對其的采用應當受到審閱和驗證。設計模式可以包含在設計和開發過程中。在任何一種情況中,設計模式的使用應當由審閱者確認和驗證。在審閱過程中還可能會遇到這樣的情況,額外的設計模式不適用於最初包括的地方。即使環境中沒有進行正式的審閱,這一步驟也可以通過同事審閱或者團隊討論來完成。這一步驟中的審閱者要麽是主要團隊的成員,要麽與他們建立開放通信。
  指導采用對於broad exposure類別的設計模式非常關鍵。這些設計模式具有很多相關的風險,因為他們將創建依賴性。這些依賴性可能在一些對象類中,例如,衹工作在更加廣泛的DAO設計模式實現範圍中的數據訪問對象(DAO)、或者跨應用程序邊界(如使用Value Object設計模式在應用程序和應用程序層之間傳輸數據)。這些設計模式也可以由項目中的其他人或者不同項目的人實現,而且實現應當重新使用,不同於創建另一種獨特的實現。
  重用實現,不衹是設計模式
  衹要在創建自己的設計模式實現中有一定的滿足,團隊和公司就可以在重用發生在代碼層時,而不是設計創意層時獲得更多益處。使企業獲益的最初設計模式是改進的實現。但是,真正的目標是重用實現。重用實現將導致:a)其他可重用的類(取决於公共實現);b)縮短開發時間和降低成本;c)縮短維護時間和降低成本;d)在應用程序之間和內部輕鬆集成。
  這種重用對broad exposure設計模式非常重要(有時是基本的)。這些設計模式創建了外部依賴性(集成將從公共實現中受益)或者産生全部的自定義類庫(如果有公共基礎將可重用)。isolated use設計模式也可以從重用中獲益,但是如果他們是根據具體情況定製的,他們就非常難以重用。
  有時您可能會問自己:“如果重用比較好,為什麽設計模式和可以重用的實現不可以一同應用呢?”在我們討論設計模式如何使更多讀者獲益的時候纔會討論這個問題。如果可能,如果已經預定義了實現,那麽達到廣泛適用性這個目標就會非常睏難。然而,一旦設計模式被應用到特殊的問題域或者技術基礎設施中,那麽就可以重用在該環境中産生的實現。
  架構中的設計模式
  這看起來像是一件可怕的任務,需要掌握設計模式如何應用在實際情況中,如何構建優質的實現,以及如何促進重用實現。完成該任務的方法之一就是在環境中引入應用程序架構。應用程序架構提供了應用程序需要的結構,從而使開發團隊可以關註應用程序的域邏輯。這包含了已實現的設計模式。除了重用設計模式概念或者單個實現之外,可以在多個項目和應用程序之間重用架構。這種共享的公共實現確保了兼容性,並為開發和維護多種不同的實現提供了一種低成本替代方案。兼容性提供了重新使用需要的技術基礎。沒有足夠的篇幅在這裏深入討論架構的其他重要品質,如運行時監測和管理、可配置應用程序邏輯和適應性行為等。您可以從Carnegie Mellon Software Engineering Institute (www.sei.cmu.edu/ata/ata_init.html) 中學習到更多有關架構的知識。
設計模式的形象比喻
  1、FACTORY—追MM少不了請吃飯了,麥當勞的雞翅和肯德基的雞翅都是MM愛吃的東西,雖然口味有所不同,但不管你帶MM去麥當勞或肯德基,衹管嚮服務員說“來四個雞翅”就行了。麥當勞和肯德基就是生産雞翅的Factory
  工廠模式:客戶類和工廠類分開。消費者任何時候需要某種産品,衹需嚮工廠請求即可。消費者無須修改就可以接納新産品。缺點是當産品修改時,工廠類也要做相應的修改。如:如何創建及如何嚮客戶端提供。
  2、BUILDER—MM最愛聽的就是“我愛你”這句話了,見到不同地方的MM,要能夠用她們的方言跟她說這句話哦,我有一個多種語言翻譯機,上面每種語言都有一個按鍵,見到MM我衹要按對應的鍵,它就能夠用相應的語言說出“我愛你”這句話了,國外的MM也可以輕鬆搞掂,這就是我的“我愛你 ”builder。(這一定比美軍在伊拉剋用的翻譯機好賣)
  建造模式:將産品的內部表象和産品的生成過程分割開來,從而使一個建造過程生成具有不同的內部表象的産品對象。建造模式使得産品內部表象可以獨立的變化,客戶不必知道産品內部組成的細節。建造模式可以強製實行一種分步驟進行的建造過程。
  3、FACTORY METHOD—請MM去麥當勞吃漢堡,不同的MM有不同的口味,要每個都記住是一件煩人的事情,我一般采用Factory Method模式,帶着MM到服務員那兒,說“要一個漢堡”,具體要什麽樣的漢堡呢,讓MM直接跟服務員說就行了。
  工廠方法模式:核心工廠類不再負責所有産品的創建,而是將具體創建的工作交給子類去做,成為一個抽象工廠角色,僅負責給出具體工廠類必須實現的接口,而不接觸哪一個産品類應當被實例化這種細節。
  4、PROTOTYPE—跟MM用QQ聊天,一定要說些深情的話語了,我搜集了好多肉麻的情話,需要時衹要copy出來放到QQ裏面就行了,這就是我的情話prototype了。(100塊錢一份,你要不要)
  原始模型模式:通過給出一個原型對象來指明所要創建的對象的類型,然後用復製這個原型對象的方法創建出更多同類型的對象。原始模型模式允許動態的增加或減少産品類,産品類不需要非得有任何事先確定的等級結構,原始模型模式適用於任何的等級結構。缺點是每一個類都必須配備一個剋隆方法。
  5、SINGLETON—俺有6個漂亮的老婆,她們的老公都是我,我就是我們傢裏的老公Sigleton,她們衹要說道“老公”,都是指的同一個人,那就是我(剛纔做了個夢啦,哪有這麽好的事)
  單例模式:單例模式確保某一個類衹有一個實例,而且自行實例化並嚮整個係統提供這個實例單例模式。單例模式衹應在有真正的“單一實例”的需求時纔可使用。
  6、ADAPTER—在朋友聚會上碰到了一個美女Sarah,從香港來的,可我不會說粵語,她不會說普通話,衹好求助於我的朋友kent了,他作為我和Sarah之間的Adapter,讓我和Sarah可以相互交談了(也不知道他會不會耍我)
  適配器(變壓器)模式:把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口原因不匹配而無法一起工作的兩個類能夠一起工作。適配類可以根據參數返還一個合適的實例給客戶端。
  7、BRIDGE—早上碰到MM,要說早上好,晚上碰到MM,要說晚上好;碰到MM穿了件新衣服,要說你的衣服好漂亮哦,碰到MM新做的發型,要說你的頭髮好漂亮哦。不要問我“早上碰到MM新做了個發型怎麽說”這種問題,自己用BRIDGE組合一下不就行了
  橋梁模式:將抽象化與實現化脫耦,使得二者可以獨立的變化,也就是說將他們之間的強關聯變成弱關聯,也就是指在一個軟件係統的抽象化和實現化之間使用組合/聚合關係而不是繼承關係,從而使兩者可以獨立的變化。
  8、COMPOSITE—Mary今天過生日。“我過生日,你要送我一件禮物。”“嗯,好吧,去商店,你自己挑。”“這件T恤挺漂亮,買,這條裙子好看,買,這個包也不錯,買。”“喂,買了三件了呀,我衹答應送一件禮物的哦。”“什麽呀,T恤加裙子加包包,正好配成一套呀,小姐,麻煩你包起來。 ”“……”,MM都會用Composite模式了,你會了沒有?
  合成模式:合成模式將對象組織到樹結構中,可以用來描述整體與部分的關係。合成模式就是一個處理對象的樹結構的模式。合成模式把部分與整體的關係用樹結構表示出來。合成模式使得客戶端把一個個單獨的成分對象和由他們復合而成的合成對象同等看待。
  9、DECORATOR—Mary過完輪到Sarly過生日,還是不要叫她自己挑了,不然這個月伙食費肯定玩完,拿出我去年在華山頂上照的照片,在背面寫上“最好的的禮物,就是愛你的Fita”,再到街上禮品店買了個像框(賣禮品的MM也很漂亮哦),再找隔壁搞美術設計的Mike設計了一個漂亮的盒子裝起來……,我們都是Decorator,最終都在修飾我這個人呀,怎麽樣,看懂了嗎?
  裝飾模式:裝飾模式以對客戶端透明的方式擴展對象的功能,是繼承關係的一個替代方案,提供比繼承更多的靈活性。動態給一個對象增加功能,這些功能可以再動態的撤消。增加由一些基本功能的排列組合而産生的非常大量的功能。
  10、FACADE—我有一個專業的Nikon相機,我就喜歡自己手動調光圈、快門,這樣照出來的照片纔專業,但MM可不懂這些,教了半天也不會。幸好相機有Facade設計模式,把相機調整到自動檔,衹要對準目標按快門就行了,一切由相機自動調整,這樣MM也可以用這個相機給我拍張照片了。
  門面模式:外部與一個子係統的通信必須通過一個統一的門面對象進行。門面模式提供一個高層次的接口,使得子係統更易於使用。每一個子係統衹有一個門面類,而且此門面類衹有一個實例,也就是說它是一個單例模式。但整個係統可以有多個門面類。
  11、FLYWEIGHT—每天跟MM發短信,手指都纍死了,最近買了個新手機,可以把一些常用的句子存在手機裏,要用的時候,直接拿出來,在前面加上MM的名字就可以發送了,再不用一個字一個字敲了。共享的句子就是Flyweight,MM的名字就是提取出來的外部特徵,根據上下文情況使用。
  享元模式:FLYWEIGHT在拳擊比賽中指最輕量級。享元模式以共享的方式高效的支持大量的細粒度對象。享元模式能做到共享的關鍵是區分內藴狀態和外藴狀態。內藴狀態存儲在享元內部,不會隨環境的改變而有所不同。外藴狀態是隨環境的改變而改變的。外藴狀態不能影響內藴狀態,它們是相互獨立的。將可以共享的狀態和不可以共享的狀態從常規類中區分開來,將不可以共享的狀態從類裏剔除出去。客戶端不可以直接創建被共享的對象,而應當使用一個工廠對象負責創建被共享的對象。享元模式大幅度的降低內存中對象的數量。
  12、PROXY—跟MM在網上聊天,一開頭總是“hi,你好”,“你從哪兒來呀?”“你多大了?”“身高多少呀?”這些話,真煩人,寫個程序做為我的Proxy吧,凡是接收到這些話都設置好了自動的回答,接收到其他的話時再通知我回答,怎麽樣,酷吧。
  代理模式:代理模式給某一個對象提供一個代理對象,並由代理對象控製對源對象的引用。代理就是一個人或一個機構代表另一個人或者一個機構采取行動。某些情況下,客戶不想或者不能夠直接引用一個對象,代理對象可以在客戶和目標對象直接起到中介的作用。客戶端分辨不出代理主題對象與真實主題對象。代理模式可以並不知道真正的被代理對象,而僅僅持有一個被代理對象的接口,這時候代理對象不能夠創建被代理對象,被代理對象必須有係統的其他角色代為創建並傳入。
  13、CHAIN OF RESPONSIBLEITY—晚上去上英語課,為了好開溜坐到了最後一排,哇,前面坐了好幾個漂亮的MM哎,找張紙條,寫上“Hi,可以做我的女朋友嗎?如果不願意請嚮前傳”,紙條就一個接一個的傳上去了,糟糕,傳到第一排的MM把紙條傳給老師了,聽說是個老處女呀,快跑!
  責任鏈模式:在責任鏈模式中,很多對象由每一個對象對其下傢的引用而接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象决定處理此請求。客戶並不知道鏈上的哪一個對象最終處理這個請求,係統可以在不影響客戶端的情況下動態的重新組織鏈和分配責任。處理者有兩個選擇:承擔責任或者把責任推給下傢。一個請求可以最終不被任何接收端對象所接受。
  14、COMMAND—俺有一個MM傢裏管得特別嚴,沒法見面,衹好藉助於她弟弟在我們倆之間傳送信息,她對我有什麽指示,就寫一張紙條讓她弟弟帶給我。這不,她弟弟又傳送過來一個COMMAND,為了感謝他,我請他吃了碗雜醬面,哪知道他說:“我同時給我姐姐三個男朋友送COMMAND,就數你最小氣,纔請我吃面。”
  命令模式:命令模式把一個請求或者操作封裝到一個對象中。命令模式把發出命令的責任和執行命令的責任分割開,委派給不同的對象。命令模式允許請求的一方和發送的一方獨立開來,使得請求的一方不必知道接收請求的一方的接口,更不必知道請求是怎麽被接收,以及操作是否執行,何時被執行以及是怎麽被執行的。係統支持命令的撤消。
  15、INTERPRETER—俺有一個《泡MM真經》,上面有各種泡MM的攻略,比如說去吃西餐的步驟、去看電影的方法等等,跟MM約會時,衹要做一個Interpreter,照着上面的腳本執行就可以了。
  解釋器模式:給定一個語言後,解釋器模式可以定義出其文法的一種表示,並同時提供一個解釋器。客戶端可以使用這個解釋器來解釋這個語言中的句子。解釋器模式將描述怎樣在有了一個簡單的文法後,使用模式設計解釋這些語句。在解釋器模式裏面提到的語言是指任何解釋器對象能夠解釋的任何組合。在解釋器模式中需要定義一個代表文法的命令類的等級結構,也就是一係列的組合規則。每一個命令對象都有一個解釋方法,代表對命令對象的解釋。命令對象的等級結構中的對象的任何排列組合都是一個語言。
  16、ITERATOR—我愛上了Mary,不顧一切的嚮她求婚。
  Mary:“想要我跟你結婚,得答應我的條件”
  我:“什麽條件我都答應,你說吧”
  Mary:“我看上了那個一剋拉的鑽石”
  我:“我買,我買,還有嗎?”
  Mary:“我看上了湖邊的那棟別墅”
  我:“我買,我買,還有嗎?”
  Mary:“我看上那輛法拉利跑車”
  我腦袋嗡的一聲,坐在椅子上,一咬牙:“我買,我買,還有嗎?”
  迭代子模式:迭代子模式可以順序訪問一個聚集中的元素而不必暴露聚集的內部表象。多個對象聚在一起形成的總體稱之為聚集,聚集對象是能夠包容一組對象的容器對象。迭代子模式將迭代邏輯封裝到一個獨立的子對象中,從而與聚集本身隔開。迭代子模式簡化了聚集的界面。每一個聚集對象都可以有一個或一個以上的迭代子對象,每一個迭代子的迭代狀態可以是彼此獨立的。迭代算法可以獨立於聚集角色變化。
  17、MEDIATOR—四個MM打麻將,相互之間誰應該給誰多少錢算不清楚了,幸虧當時我在旁邊,按照各自的籌碼數算錢,賺了錢的從我這裏拿,賠了錢的也付給我,一切就OK啦,俺得到了四個MM的電話。
  調停者模式:調停者模式包裝了一係列對象相互作用的方式,使得這些對象不必相互明顯作用。從而使他們可以鬆散偶合。當某些對象之間的作用發生改變時,不會立即影響其他的一些對象之間的作用。保證這些作用可以彼此獨立的變化。調停者模式將多對多的相互作用轉化為一對多的相互作用。調停者模式將對象的行為和協作抽象化,把對象在小尺度的行為上與其他對象的相互作用分開處理。
  18、MEMENTO—同時跟幾個MM聊天時,一定要記清楚剛纔跟MM說了些什麽話,不然MM發現了會不高興的哦,幸虧我有個備忘錄,剛纔與哪個MM說了什麽話我都拷貝一份放到備忘錄裏面保存,這樣可以隨時察看以前的記錄啦。
  備忘錄模式:備忘錄對象是一個用來存儲另外一個對象內部狀態的快照的對象。備忘錄模式的用意是在不破壞封裝的條件下,將一個對象的狀態捉住,並外部化,存儲起來,從而可以在將來合適的時候把這個對象還原到存儲起來的狀態。
  19、OBSERVER—想知道咱們公司最新MM情報嗎?加入公司的MM情報郵件組就行了,tom負責搜集情報,他發現的新情報不用一個一個通知我們,直接發佈給郵件組,我們作為訂閱者(觀察者)就可以及時收到情報啦
  觀察者模式:觀察者模式定義了一種一隊多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態上發生變化時,會通知所有觀察者對象,使他們能夠自動更新自己。
  20、STATE—跟MM交往時,一定要註意她的狀態哦,在不同的狀態時她的行為會有不同,比如你約她今天晚上去看電影,對你沒興趣的MM就會說 “有事情啦”,對你不討厭但還沒喜歡上的MM就會說“好啊,不過可以帶上我同事麽?”,已經喜歡上你的MM就會說“幾點鐘?看完電影再去泡吧怎麽樣?”,當然你看電影過程中表現良好的話,也可以把MM的狀態從不討厭不喜歡變成喜歡哦。
  狀態模式:狀態模式允許一個對象在其內部狀態改變的時候改變行為。這個對象看上去象是改變了它的類一樣。狀態模式把所研究的對象的行為包裝在不同的狀態對象裏,每一個狀態對象都屬於一個抽象狀態類的一個子類。狀態模式的意圖是讓一個對象在其內部狀態改變的時候,其行為也隨之改變。狀態模式需要對每一個係統可能取得的狀態創立一個狀態類的子類。當係統的狀態變化時,係統便改變所選的子類。
  21、STRATEGY—跟不同類型的MM約會,要用不同的策略,有的請電影比較好,有的則去吃小吃效果不錯,有的去海邊浪漫最合適,單目的都是為了得到MM的芳心,我的追MM錦囊中有好多Strategy哦。
  策略模式:策略模式針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,從而使得它們可以相互替換。策略模式使得算法可以在不影響到客戶端的情況下發生變化。策略模式把行為和環境分開。環境類負責維持和查詢行為類,各種算法在具體的策略類中提供。由於算法和環境獨立開來,算法的增減,修改都不會影響到環境和客戶端。
  22、TEMPLATE METHOD——看過《如何說服女生上床》這部經典文章嗎?女生從認識到上床的不變的步驟分為巧遇、打破僵局、展開追求、接吻、前戲、動手、愛撫、進去八大步驟(Template method),但每個步驟針對不同的情況,都有不一樣的做法,這就要看你隨機應變啦(具體實現);
  模板方法模式:模板方法模式準備一個抽象類,將部分邏輯以具體方法以及具體構造子的形式實現,然後聲明一些抽象方法來迫使子類實現剩餘的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不同的實現。先製定一個頂級邏輯框架,而將邏輯的細節留給具體的子類去實現。
  23、VISITOR—情人節到了,要給每個MM送一束鮮花和一張卡片,可是每個MM送的花都要針對她個人的特點,每張卡片也要根據個人的特點來挑,我一個人哪搞得清楚,還是找花店老闆和禮品店老闆做一下Visitor,讓花店老闆根據MM的特點選一束花,讓禮品店老闆也根據每個人特點選一張卡,這樣就輕鬆多了;
  訪問者模式:訪問者模式的目的是封裝一些施加於某種數據結構元素之上的操作。一旦這些操作需要修改的話,接受這個操作的數據結構可以保持不變。訪問者模式適用於數據結構相對未定的係統,它把數據結構和作用於結構上的操作之間的耦合解脫開,使得操作集合可以相對自由的演化。訪問者模式使得增加新的操作變的很容易,就是增加一個新的訪問者類。訪問者模式將有關的行為集中到一個訪問者對象中,而不是分散到一個個的節點類中。當使用訪問者模式時,要將盡可能多的對象瀏覽邏輯放在訪問者類中,而不是放到它的子類中。訪問者模式可以跨過幾個類的等級結構訪問屬於不同的等級結構的成員類。
  圖書《設計模式:基於C#的工程化實現及擴展》作 者: 王翔 著
  出 版 社: 電子工業出版社
  出版時間: 2009-1-1
  字 數: 850000
  版 次: 1
  頁 數: 652
  開 本: 16開
  印 次: 1
  紙 張: 膠版紙
  I S B N : 9787121075070
  包 裝: 平裝
  所屬分類: 圖書 >> 計算機/網絡 >> 程序設計 >> C C++ C# VC VC++
  定價:¥98.00
  編輯推薦
  專傢推薦
  本書立意明確,除了告訴你問題的類型與解法,還提供了可以立即演繹的程序代碼,相信這本案頭的工具書可以提供你一個不錯的思維模式,幫你造就有彈性、能擴充、易維護的軟件實體。
  鬍百敬 微軟MVP,臺灣恆逸資訊資深講師,“數據庫鐵人”
  作者從GOF23種經典設計模式開始,帶你走進模式的失門,小到細粒度的基礎模式,大到粗粒度的架構模式,本書都做了詳盡的講解。如果您還在為了軟件需求的無盡變化而煩惱不斷,為了在軟件設計領域更上一層樓而苦苦思索,希望本書能夠帶給您一些啓發。
  李會軍 微軟MVP,博客園專傢,IT168專欄作者
  本書很有特色的地方,就是以工程角度來闡釋模式,相較純粹的模式之說,則更具普遍的下手角度,C≠語言的高級特性結合設計模式的經典思想,兩者相得益彰。
  王濤 微軟MVP,博客園專傢,《你必須知道的.NET》作者
  內容簡介
  本書基於C# 2.0的語法,試圖將GOF 23中的模式以一種可工程化的公共庫而非Example的方式呈現給讀者。內容包括以下7部分。
  第1篇主要是概括性的介紹;第2篇創建型模式介紹通過將實例化職責委托他方對象的辦法,隔離客戶程序與具體類型實例化的依賴關係,保證客戶程序(或者外部係統)獲得期望具體類型實例的、同時不必發生直接的引用;第3篇結構型模式的重點在於如何通過靈活的體係組織不同的對象,並在此基礎上完成更為復雜的類型(或者類型係統),而參與組合的各類型之間始終保持盡量鬆散的結構關係;第4篇行為型模式關註於應用運行過程中算法的提供和通信關係的梳理;第5篇主要介紹小顆粒度基礎模式和應用案例;第6篇主要介紹應用全局的模式化的實現方法,包括現在已經被普遍應用的N層模式及某些關鍵性框架産品采用的“微內核”模式;第7篇主要是一些針對Web和Web Service領域的模式設計技術。
  本書主要針對對C#語言和.NET Framework平臺有一定瞭解或有一定應用經驗的用戶,尤其適於那些希望運用模式技術在設計和開發方面多應對些挑戰的用戶。
  作者簡介
  王翔,軟件架構師,主要從事.NET、XML、公鑰基礎設施的開發。專註於數據(尤其是XML信息)的生産、加工、交換、提煉等過程。最近參與了一係列有關應用密碼技術和PKI環境保護信息係統數據安全的項目。
  最喜歡數學,平常案頭總是擺一本數學練習題。閑暇時間喜歡寫作,通過發表多種技術文章與國內外同行交流各種數據應用經驗。
  項目間隙經常到各海濱城市徒步旅行、野外露營、出海航行、極限運動,這幾年烹飪也漸漸成為個人主要愛好。
英文解釋
  1. :  design pattern
相關詞
電子數據結構與算法軟件網絡網絡監控協議分析計算機互聯網
編程軟件工程javaj2ee四人組軟件開發DesignPattern
ioc開發框架反轉控製模式框架更多結果...
包含詞
大話設計模式易學設計模式設計模式之禪
軟件設計模式原型設計模式通用設計模式
多綫程設計模式精通與設計模式設計模式(影印版)
網站交互設計模式SymbianOS通用設計模式JavaEE設計模式
《設計模式》精通CSS與HTML設計模式HeadFirst設計模式
Java設計模式實用軟件設計模式教程JavaScript設計模式
C#設計模式(影印版)設計模式解析(影印版)網站交互設計模式:第2版
ActionScript3.0設計模式J2EE項目實訓:UML及設計模式Ruby設計模式
C#3.0設計模式ActionScript3設計模式JAVA多綫程設計模式
Ajax設計模式西遊記設計模式與應用開發項目實訓及設計模式
設計模式:可復用面嚮對象軟件的基礎C++設計模式-基於Qt4開源跨平臺開發框架西遊記、設計模式與IBMWebSpherePortal應用開發
設計模式-基於開源跨平臺開發框架高級程序設計模式框架與測試