隨筆-11  評論-0  文章-0  trackbacks-0

          Longronglin之設(shè)計模式:

          Christopher Alexander 說過:“每一個模式描述了一個在我們周圍不斷重復發(fā)生的問題,以及該問題的解決方案的核心。這樣,你就能一次又一次地使用該方案而不必做重復勞動”
          模式描述為:在一定環(huán)境中解決某一問題的方案,包括三個基本元素--問題,解決方案和環(huán)境。
          閱讀類圖和對象圖請先學習UML
          創(chuàng)建模式 結(jié)構(gòu)模式 行為模式
          創(chuàng)建模式:對類的實例化過程的抽象。一些系統(tǒng)在創(chuàng)建對象時,需要動態(tài)地決定怎樣創(chuàng)建對象,創(chuàng)建哪些對象,以及如何組合和表示這些對象。創(chuàng)建模式描述了怎樣構(gòu)造和封裝這些動態(tài)的決定。包含類的創(chuàng)建模式和對象的創(chuàng)建模式。
          結(jié)構(gòu)模式:描述如何將類或?qū)ο蠼Y(jié)合在一起形成更大的結(jié)構(gòu)。分為類的結(jié)構(gòu)模式和對象的結(jié)構(gòu)模式。類的結(jié)構(gòu)模式使用繼承把類,接口等組合在一起,以形成更大的結(jié)構(gòu)。類的結(jié)構(gòu)模式是靜態(tài)的。對象的結(jié)構(gòu)模式描述怎樣把各種不同類型的對象組合在一起,以實現(xiàn)新的功能的方法。對象的結(jié)構(gòu)模式是動態(tài)的。
          行為模式:對在不同的對象之間劃分責任和算法的抽象化。不僅僅是關(guān)于類和對象的,并是關(guān)于他們之間的相互作用。類的行為模式使用繼承關(guān)系在幾個類之間分配行為。對象的行為模式則使用對象的聚合來分配行為。
          設(shè)計模式使用排行:

          頻率
          所屬類型
          模式名稱
          模式
          簡單定義
          5
          創(chuàng)建型
          Singleton
          單件
          保證一個類只有一個實例,并提供一個訪問它的全局訪問點。
          5
          結(jié)構(gòu)型
          Composite
          組合模式
          將對象組合成樹形結(jié)構(gòu)以表示部分整體的關(guān)系,Composite使得用戶對單個對象和組合對象的使用具有一致性。
          5
          結(jié)構(gòu)型
          FAÇADE
          外觀
          為子系統(tǒng)中的一組接口提供一致的界面,facade提供了一高層接口,這個接口使得子系統(tǒng)更容易使用。
          5
          結(jié)構(gòu)型
          Proxy
          代理
          為其他對象提供一種代理以控制對這個對象的訪問
          5
          行為型
          Iterator
          迭代器
          提供一個方法順序訪問一個聚合對象的各個元素,而又不需要暴露該對象的內(nèi)部表示。
          5
          行為型
          Observer
          觀察者
          定義對象間一對多的依賴關(guān)系,當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知自動更新。
          5
          行為型
          Template Method
          模板方法
          定義一個操作中的算法的骨架,而將一些步驟延遲到子類中,Template Method使得子類可以不改變一個算法的結(jié)構(gòu)即可以重定義該算法得某些特定步驟。
          4
          創(chuàng)建型
          Abstract Factory
          抽象工廠
          提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無須指定它們的具體類。
          4
          創(chuàng)建型
          Factory Method
          工廠方法
          定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類,F(xiàn)actory Method使一個類的實例化延遲到了子類。
          4
          結(jié)構(gòu)型
          Adapter
          適配器
          將一類的接口轉(zhuǎn)換成客戶希望的另外一個接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些類可以一起工作。
          4
          結(jié)構(gòu)型
          Decorator
          裝飾
          動態(tài)地給一個對象增加一些額外的職責,就增加的功能來說,Decorator模式相比生成子類更加靈活。
          4
          行為型
          Command
          命令
          將一個請求封裝為一個對象,從而使你可以用不同的請求對客戶進行參數(shù)化,對請求排隊和記錄請求日志,以及支持可撤銷的操作。
          4
          行為型
          State
          狀態(tài)
          允許對象在其內(nèi)部狀態(tài)改變時改變他的行為。對象看起來似乎改變了他的類。
          4
          行為型
          Strategy
          策略模式
          定義一系列的算法,把他們一個個封裝起來,并使他們可以互相替換,本模式使得算法可以獨立于使用它們的客戶。
          3
          創(chuàng)建型
          Builder
          生成器
          將一個復雜對象的構(gòu)建與他的表示相分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
          3
          結(jié)構(gòu)型
          Bridge
          橋接
          將抽象部分與它的實現(xiàn)部分相分離,使他們可以獨立的變化。
          3
          行為型
          China of Responsibility
          職責鏈
          使多個對象都有機會處理請求,從而避免請求的送發(fā)者和接收者之間的耦合關(guān)系
          2
          創(chuàng)建型
          Prototype
          原型
          用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型來創(chuàng)建新的對象。
          2
          結(jié)構(gòu)型
          Flyweight
          享元
          享元模式以共享的方式高效的支持大量的細粒度對象。享元模式能做到共享的關(guān)鍵是區(qū)分內(nèi)蘊狀態(tài)和外蘊狀態(tài)。內(nèi)蘊狀態(tài)存儲在享元內(nèi)部,不會隨環(huán)境的改變而有所不同。外蘊狀態(tài)是隨環(huán)境的改變而改變的。
          2
          行為型
          Mediator
          中介者
          用一個中介對象封裝一些列的對象交互。
          2
          行為型
          Visitor
          訪問者模式
          表示一個作用于某對象結(jié)構(gòu)中的各元素的操作,它使你可以在不改變各元素類的前提下定義作用于這個元素的新操作。
          1
          行為型
          Interpreter
          解釋器
          給定一個語言,定義他的文法的一個表示,并定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。
          1
          行為型
          Memento
          備忘錄
          在不破壞對象的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。

           
          一 : 單例模式(Singleton)
          單例模式:Singleton的作用是保證在應(yīng)用程序中,一個類Class只有一個實例存在。并提供全局訪問。
          結(jié)構(gòu):
          賬本類:1 單一實例 2 給多個對象共享 3 自己創(chuàng)建
          網(wǎng)頁計數(shù)器
          public class LazySingleton
          {
               private static LazySingleton newInstance = null;
            private LazySingleton ()
          {
          }
          public static synchronized  LazySingleton getInstance ()
          {
                         if (newInstance == null)
          {
                          newInstance = new LazySingleton ();
                    }
                    return newInstance;
          }
          }
          singleton
          限制了實例個數(shù),有利于gc的回收。
          二:策略模式(Strategy)  
          策略模式:策略模式針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,從而使得它們可以相互替換。策略模式使得算法可以在不影響到客戶端的情況下發(fā)生變化。策略模式把行為和環(huán)境分開。環(huán)境類負責維持和查詢行為類,各種算法在具體的策略類中提供。由于算法和環(huán)境獨立開來,算法的增減,修改都不會影響到環(huán)境和客戶端。
          結(jié)構(gòu):
          使用QQ泡MM時使用外掛  客戶端 :ME 抽象類: 外掛 具體:策略(圖片,笑話,名人名言)
          圖書銷售算法(不同書本折扣的算法)
          三:原型模式(Prototype)
          原型模式:通過給出一個原型對象來指明所要創(chuàng)建的對象的類型,然后用復制這個原型對象的方法創(chuàng)建出更多同類型的對象。原始模型模式允許動態(tài)的增加或減少產(chǎn)品類,產(chǎn)品類不需要非得有任何事先確定的等級結(jié)構(gòu),原始模型模式適用于任何的等級結(jié)構(gòu)。缺點是每一個類都必須配備一個克隆方法
          結(jié)構(gòu):
          復印技術(shù): 1 不是同一個對象 2 屬同類
          短消息(轉(zhuǎn)發(fā)) 1-n個MM
          因為Java中的提供clone()方法來實現(xiàn)對象的克隆,所以Prototype模式實現(xiàn)一下子變得很簡單.
          四:門面模式(Façade)
          門面模式:外部與一個子系統(tǒng)的通信必須通過一個統(tǒng)一的門面對象進行。門面模式提供一個高層次的接口,使得子系統(tǒng)更易于使用,減少復雜性。每一個子系統(tǒng)只有一個門面類,而且此門面類只有一個實例,也就是說它是一個單例模式。但整個系統(tǒng)可以有多個門面類。
          門面角色 2 子系統(tǒng)角色
          結(jié)構(gòu):
          Facade典型應(yīng)用就是數(shù)據(jù)庫JDBC的應(yīng)用和Session的應(yīng)用
          ME---àMM---à(father,mum,sister,brother)
          五:備忘錄模式(Memento)
          Memento模式:Memento對象是一個保存另外一個對象內(nèi)部狀態(tài)拷貝的對象,這樣以后就可以將該對象恢復到原先保存的狀態(tài)。模式的用意是在不破壞封裝的條件下,將一個對象的狀態(tài)捕捉住,并外部化,存儲起來,從而可以在將來合適的時候把這個對象還原到存儲起來的狀態(tài)。模式所涉及的角色有三個,備忘錄角色、發(fā)起人角色和負責人角色。
          備忘錄角色的作用:
          (1) 將發(fā)起人對象的內(nèi)部狀態(tài)存儲起來,備忘錄可以根據(jù)發(fā)起人對象的判斷來決定存儲多少發(fā)起人對象的內(nèi)部狀態(tài)。
          (2) 備忘錄可以保護其內(nèi)容不被發(fā)起人對象之外的任何對象所讀取。
          發(fā)起人角色的作用:
          (1) 創(chuàng)建一個含有當前內(nèi)部狀態(tài)的備忘錄對象。
          (2) 使用備忘錄對象存儲其內(nèi)部狀態(tài)。
          負責人角色的作用:
          (1) 負責保存?zhèn)渫泴ο蟆?/span>
          (2) 不檢查備忘錄對象的內(nèi)容
          結(jié)構(gòu):
          備份系統(tǒng)時使用
          GHOST
          六 : 命令模式(Command)
          命令模式:命令模式把一個請求或者操作封裝到一個對象中。命令模式把發(fā)出命令的責任和執(zhí)行命令的責任分割開,委派給不同的對象。命令模式允許請求的一方和發(fā)送的一方獨立開來,使得請求的一方不必知道接收請求的一方的接口,更不必知道請求是怎么被接收,以及操作是否執(zhí)行,何時被執(zhí)行以及是怎么被執(zhí)行的。系統(tǒng)支持命令的撤消
          結(jié)構(gòu):
           
          MM(客戶端)--àME(請求者)--à命令角色--à(具體命令)-à代理處(接收者)--àMM
          上網(wǎng) IE 輸入 http地址 發(fā)送命令
          七: 解釋器(Interpreter)
          解釋器模式:給定一個語言后,解釋器模式可以定義出其文法的一種表示,并同時提供一個解釋器。客戶端可以使用這個解釋器來解釋這個語言中的句子。解釋器模式將描述怎樣在有了一個簡單的文法后,使用模式設(shè)計解釋這些語句。在解釋器模式里面提到的語言是指任何解釋器對象能夠解釋的任何組合。在解釋器模式中需要定義一個代表文法的命令類的等級結(jié)構(gòu),也就是一系列的組合規(guī)則。每一個命令對象都有一個解釋方法,代表對命令對象的解釋。命令對象的等級結(jié)構(gòu)中的對象的任何排列組合都是一個語言。
          結(jié)構(gòu):
          編譯原理之編譯器
          文言文注釋:一段文言文,將它翻譯成白話文
          八:調(diào)停者模式(Mediator)
          調(diào)停者模式:包裝了一系列對象相互作用的方式,使得這些對象不必相互明顯作用。從而使他們可以松散偶合。當某些對象之間的作用發(fā)生改變時,不會立即影響其他的一些對象之間的作用。保證這些作用可以彼此獨立的變化。調(diào)停者模式將多對多的相互作用轉(zhuǎn)化為一對多的相互作用。調(diào)停者模式將對象的行為和協(xié)作抽象化,把對象在小尺度的行為上與其他對象的相互作用分開處理。
          結(jié)構(gòu):
          法院和原告,被告的關(guān)系
          九:責任鏈模式(CHAIN OF RESPONSIBLEITY)
          責任鏈模式:執(zhí)行者的不確定性 在責任鏈模式中,很多對象由每一個對象對其下家的引用而接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。客戶并不知道鏈上的哪一個對象最終處理這個請求,系統(tǒng)可以在不影響客戶端的情況下動態(tài)的重新組織鏈和分配責任。處理者有兩個選擇:承擔責任或者把責任推給下家。一個請求可以最終不被任何接收端對象所接受。
          結(jié)構(gòu):
          典型的對象結(jié)構(gòu):
          喝酒時通過成語接龍決定誰喝酒(馬到成功-功不可沒-沒完沒了)
          十:工廠模式(Factory)
          工廠模式定義一個用于創(chuàng)建對象的接口,讓接口子類通過工廠方法決定實例化哪一個類。
          結(jié)構(gòu):
          水果園—〉(葡萄園,蘋果園)--〉(葡萄,蘋果)(各自生產(chǎn))
          十一:抽象工廠模式(Abstract Factory)
          抽象工廠模式:提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無需指定它們具體的類。
          結(jié)構(gòu):
          女媧造人---〉(陰,陽)--〉(人,獸)----〉(男人,女人,公獸,母獸)(人和獸屬于不同的產(chǎn)品類)
          十二:建造模式(Builder)
          建造模式:將一個復雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示.Builder模式是一步一步創(chuàng)建一個復雜的對象,它允許用戶可以只通過指定復雜對象的類型和內(nèi)容就可以構(gòu)建它們.用戶不知道內(nèi)部的具體構(gòu)建細節(jié).Builder模式是非常類似抽象工廠模式,細微的區(qū)別大概只有在反復使用中才能體會到。
          將產(chǎn)品的內(nèi)部表象和產(chǎn)品的生成過程分割開來,從而使一個建造過程生成具有不同的內(nèi)部表象的產(chǎn)品對象。建造模式使得產(chǎn)品內(nèi)部表象可以獨立的變化,客戶不必知道產(chǎn)品內(nèi)部組成的細節(jié)。建造模式可以強制實行一種分步驟進行的建造過程。
          結(jié)構(gòu):
          交互圖:

           

           

          汽車制造
          十三:合成模式(Composite
          合成模式將對象以樹形結(jié)構(gòu)組織起來,以達成“部分-整體” 的層次結(jié)構(gòu),使得客戶端對單個對象和組合對象的使用具有一致性. 合成模式就是一個處理對象的樹結(jié)構(gòu)的模式。合成模式把部分與整體的關(guān)系用樹結(jié)構(gòu)表示出來。合成模式使得客戶端把一個個單獨的成分對象和由他們復合而成的合成對象同等看待。
          結(jié)構(gòu):
          windows的目錄樹(文件系統(tǒng))
          十四:裝飾模式(DECORATOR)
          裝飾模式:裝飾模式以對客戶端透明的方式擴展對象的功能,是繼承關(guān)系的一個替代方案,提供比繼承更多的靈活性。動態(tài)給一個對象增加功能,這些功能可以再動態(tài)的撤消。增加由一些基本功能的排列組合而產(chǎn)生的非常大量的功能。
          使用Decorator的理由是:這些功能需要由用戶動態(tài)決定加入的方式和時機.Decorator提供了"即插即用"的方法,在運行期間決定何時增加何種功能.
          結(jié)構(gòu):
          在visio中文件可以使用背景進行裝飾
          變廢為寶
          十五:設(shè)計模式之Adapter(適配器)    
          適配器模式:把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口原因不匹配而無法一起工作的兩個類能夠一起工作。適配類可以根據(jù)參數(shù)返還一個合適的實例給客戶端
          將兩個不兼容的類糾合在一起使用,屬于結(jié)構(gòu)型模式,需要Adaptee(被適配者)和Adaptor(適配器)兩個身份.
          為何使用?
          我們經(jīng)常碰到要將兩個沒有關(guān)系的類組合在一起使用,第一解決方案是:修改各自類的接口,但是如果我們沒有源代碼,或者,我們不愿意為了一個應(yīng)用而修改各自的接口。 怎么辦? 使用Adapter,在這兩種接口之間創(chuàng)建一個混合接口(混血兒).
          如何使用?
          實現(xiàn)Adapter方式,其實"think in Java"的"類再生"一節(jié)中已經(jīng)提到,有兩種方式:組合(composition)和繼承(inheritance).
          結(jié)構(gòu):
          對象結(jié)構(gòu):
          充電器(手機和220V電壓)
          jdbc-odbc
          十六:橋梁模式(Bridge)
          橋梁模式:將抽象化與實現(xiàn)化脫耦,使得二者可以獨立的變化。也就是說將他們之間的強關(guān)聯(lián)變成弱關(guān)聯(lián),也就是指在一個軟件系統(tǒng)的抽象化和實現(xiàn)化之間使用組合/聚合關(guān)系而不是繼承關(guān)系,從而使兩者可以獨立的變化。
          結(jié)構(gòu):
          jdbc驅(qū)動程序
          十七:代理模式(Proxy)
          代理模式:代理模式給某一個對象提供一個代理對象,并由代理對象控制對源對象的引用。代理就是一個人或一個機構(gòu)代表另一個人或者一個機構(gòu)采取行動。某些情況下,客戶不想或者不能夠直接引用一個對象,代理對象可以在客戶和目標對象直接起到中介的作用。客戶端分辨不出代理主題對象與真實主題對象。代理模式可以并不知道真正的被代理對象,而僅僅持有一個被代理對象的接口,這時候代理對象不能夠創(chuàng)建被代理對象,被代理對象必須有系統(tǒng)的其他角色代為創(chuàng)建并傳入。
          結(jié)構(gòu):
          運行時的代理結(jié)構(gòu):
          用代理服務(wù)器連接出網(wǎng)
          銷售代理(廠商)律師代理(客戶)
          foxmail
          槍手
          十八:享元模式(Flyweight)
          享元模式以共享的方式高效的支持大量的細粒度對象。享元模式能做到共享的關(guān)鍵是區(qū)分內(nèi)蘊狀態(tài)和外蘊狀態(tài)。內(nèi)蘊狀態(tài)存儲在享元內(nèi)部,不會隨環(huán)境的改變而有所不同。外蘊狀態(tài)是隨環(huán)境的改變而改變的。外蘊狀態(tài)不能影響內(nèi)蘊狀態(tài),它們是相互獨立的。將可以共享的狀態(tài)和不可以共享的狀態(tài)從常規(guī)類中區(qū)分開來,將不可以共享的狀態(tài)從類里剔除出去。客戶端不可以直接創(chuàng)建被共享的對象,而應(yīng)當使用一個工廠對象負責創(chuàng)建被共享的對象。享元模式大幅度的降低內(nèi)存中對象的數(shù)量。
          結(jié)構(gòu):
          共享方法:
          字體的26個字母和各自的斜體等
          十九:狀態(tài)模式(State)
          狀態(tài)模式:狀態(tài)模式允許一個對象在其內(nèi)部狀態(tài)改變的時候改變行為。這個對象看上去象是改變了它的類一樣。狀態(tài)模式把所研究的對象的行為包裝在不同的狀態(tài)對象里,每一個狀態(tài)對象都屬于一個抽象狀態(tài)類的一個子類。狀態(tài)模式的意圖是讓一個對象在其內(nèi)部狀態(tài)改變的時候,其行為也隨之改變。狀態(tài)模式需要對每一個系統(tǒng)可能取得的狀態(tài)創(chuàng)立一個狀態(tài)類的子類。當系統(tǒng)的狀態(tài)變化時,系統(tǒng)便改變所選的子類。
          結(jié)構(gòu):
          人心情不同時表現(xiàn)不同有不同的行為
          編鐘
          登錄login logout
          二十:觀察者模式(Observer)
          觀察者模式:觀察者模式定義了一種一隊多的依賴關(guān)系,讓多個觀察者對象同時監(jiān)聽某一個主題對象。這個主題對象在狀態(tài)上發(fā)生變化時,會通知所有觀察者對象,使他們能夠自動更新自己。發(fā)布訂閱。
          結(jié)構(gòu):
          公司郵件系統(tǒng)everyone@sina.com的應(yīng)用。當公司員工向這個郵箱發(fā)郵件時會發(fā)給公司的每一個員工。如果設(shè)置了Outlook則會及時收到通知。
          接收到短消息
          二十一:模板方法模式(Template)
          模板方法模式:模板方法模式準備一個抽象類,將部分邏輯以具體方法以及具體構(gòu)造子的形式實現(xiàn),然后聲明一些抽象方法來迫使子類實現(xiàn)剩余的邏輯。不同的子類可以以不同的方式實現(xiàn)這些抽象方法,從而對剩余的邏輯有不同的實現(xiàn)。先制定一個頂級邏輯框架,而將邏輯的細節(jié)留給具體的子類去實現(xiàn)。
          結(jié)構(gòu):
          使用網(wǎng)頁設(shè)計時使用的模板架構(gòu)網(wǎng)頁(骨架) 算法的各個邏輯系統(tǒng)
          二十二:訪問者模式(Visitor)
          訪問者模式:訪問者模式的目的是封裝一些施加于某種數(shù)據(jù)結(jié)構(gòu)元素之上的操作。一旦這些操作需要修改的話,接受這個操作的數(shù)據(jù)結(jié)構(gòu)可以保持不變。訪問者模式適用于數(shù)據(jù)結(jié)構(gòu)相對未定的系統(tǒng),它把數(shù)據(jù)結(jié)構(gòu)和作用于結(jié)構(gòu)上的操作之間的耦合解脫開,使得操作集合可以相對自由的演化。訪問者模式使得增加新的操作變的很容易,就是增加一個新的訪問者類。訪問者模式將有關(guān)的行為集中到一個訪問者對象中,而不是分散到一個個的節(jié)點類中。當使用訪問者模式時,要將盡可能多的對象瀏覽邏輯放在訪問者類中,而不是放到它的子類中。訪問者模式可以跨過幾個類的等級結(jié)構(gòu)訪問屬于不同的等級結(jié)構(gòu)的成員類。
          結(jié)構(gòu):
          電腦銷售系統(tǒng): 訪問者(自己)---〉電腦配置系統(tǒng)(主板,CPU,內(nèi)存。。。。。。)
          二十三:迭代子模式(Iterator)
          迭代子模式:迭代子模式可以順序訪問一個聚集中的元素而不必暴露聚集的內(nèi)部表象。多個對象聚在一起形成的總體稱之為聚集,聚集對象是能夠包容一組對象的容器對象。迭代子模式將迭代邏輯封裝到一個獨立的子對象中,從而與聚集本身隔開。迭代子模式簡化了聚集的界面。每一個聚集對象都可以有一個或一個以上的迭代子對象,每一個迭代子的迭代狀態(tài)可以是彼此獨立的。迭代算法可以獨立于聚集角色變化。
          結(jié)構(gòu):
          查詢數(shù)據(jù)庫,返回結(jié)果集(map, list, set)
          二十四:MVC模式
          MVC模式:它強制性的使應(yīng)用程序的輸入、處理和輸出分開。使用MVC應(yīng)用程序被分成三個核心部件:模型、視圖、控制器。它們各自處理自己的任務(wù)。相互通信。
          MVC還使用了的設(shè)計模式,如:用來指定視圖缺省控制器的Factory Method和用來增加視圖滾動的Decorator。但是MVC的主要關(guān)系還是由ObserverCompositeStrategy三個設(shè)計模式給出的。
           
          struts圖解:其中不同顏色代表MVC的不同部分:紅色(控制器)、紫色(模型)和綠色(視圖)
          struts應(yīng)用 spring 應(yīng)用
           
          設(shè)計模式的使用:
           



           

          模式關(guān)系圖:
           
           
           
          個人圖解:(^_^)沒有看到下面的圖解時想的
          門面模式可以使用一個單體實例對象實現(xiàn)
          抽象工廠可以創(chuàng)建單體實例 也可以使用工廠方法也可以使用原型創(chuàng)建對象實例
          模板方法可以使用工廠方法實現(xiàn)創(chuàng)建實例使用策略模式定義算法使用
          策略模式可以使用享元實例 與裝飾模式可以相互使用
          享元模式被狀態(tài),解釋器,合成等模式。共享
          解釋器模式通過訪問模式實現(xiàn)其動作 通過享元實現(xiàn)基本元素的共享
          裝飾模式使用策略可以實現(xiàn)不同的裝飾效果
          迭代器模式通過訪問者訪問對象元素 通過備忘錄模式實現(xiàn)紀錄的記憶功能 訪問合成的對象
          命令模式通過使用備忘錄模式(參考) 執(zhí)行命令
          建造模式可以使用合成模式創(chuàng)建合成產(chǎn)品
          責任鏈模式使用合成模式定義鏈
          調(diào)停者模式可以使觀察者的觀察受其影響
           
           
           
          實際圖解:

          關(guān)模式(相互關(guān)系):

          Abstract Factory類通常用工廠方法(Factory Method)實現(xiàn),但它們也可以用Prototype實現(xiàn)。一個具體的工廠通常是一個單件SingletonAbstract Factory與Builder相似,因為它也可以創(chuàng)建復雜對象。主要的區(qū)別是Builder模式著重于一步步構(gòu)造一個復雜對象。而Abstract Factory著重于多個系列的產(chǎn)品對象(簡單的或是復雜的)。Builder在最后一步返回產(chǎn)品,而對于Abstract Factory來說,產(chǎn)品是立即返回的。Composite通常是用Builder生成的。
          Factory方法通常在Template Methods中被調(diào)用。Prototypes不需要創(chuàng)建Creator的子類。但是,它們通常要求一個針對Product類的Initialize操作。Creator使用Initialize來初始化對象。Factory Method不需要這樣的操作。多態(tài)迭代器靠Factory Method來例化適當?shù)牡髯宇悺?/span>Factory Method模式常被模板方法調(diào)用。
          PrototypeAbstract Factory模式在某種方面是相互競爭的。但是它們也可以一起使用。Abstract Factory可以存儲一個被克隆的原型的集合,并且返回產(chǎn)品對象。大量使用Composite和Decorator模式的設(shè)計通常也可從Prototype模式處獲益。
          很多模式可以使用Singleton模式實現(xiàn)。參見Abstract Factory、Builder,和Prototype。
          模式Bridge的結(jié)構(gòu)與對象適配器類似,但是Bridge模式的出發(fā)點不同;Bridge目的是將接口部分和實現(xiàn)部分分離,從而對它們可以較為容易也相對獨立的加以改變。而Adapter則意味著改變一個已有對象的接口。
          Decorator模式增強了其他對象的功能而同時又不改變它的接口。因此Decorator對應(yīng)用程序的透明性比適配器要好。結(jié)果是Decorator支持遞歸組合,而純粹使用適配器是不可能實現(xiàn)這一點的。模式Proxy在不改變它的接口的條件下,為另一個對象定義了一個代理。Abstract Factory模式可以用來創(chuàng)建和配置一個特定的Bridge模式。
          Adapter模式用來幫助無關(guān)的類協(xié)同工作,它通常在系統(tǒng)設(shè)計完成后才會被使用。然而,Bridge模式則是在系統(tǒng)開始時就被使用,它使得抽象接口和實現(xiàn)部分可以獨立進行改變。適配器Adapter為它所適配的對象提供了一個不同的接口。相反,代理提供了與它的實體相同的接口。然而,用于訪問保護的代理可能會拒絕執(zhí)行實體會執(zhí)行的操作,因此,它的接口實際上可能只是實體接口的一個子集。
          Decorator模式經(jīng)常與Composite模式一起使用。當裝飾和組合一起使用時,它們通常有一個公共的父類。因此裝飾必須支持具有AddRemoveGetChild 操作。Decorator模式不同于Adapter模式,因為裝飾僅改變對象的職責而不改變它的接口;而適配器將給對象一個全新的接口。Composite模式可以將裝飾視為一個退化的、僅有一個組件的組合。然而,裝飾僅給對象添加一些額外的職責—它的目的不在于對象聚集。用一個裝飾你可以改變對象的外表;而Strategy模式使得你可以改變對象的內(nèi)核。這是改變對象的兩種途徑。
          盡管Decorator的實現(xiàn)部分與Proxy相似,但Decorator的目的不一樣。Decorator為對象添加一個或多個功能,而代理則控制對對象的訪問。代理的實現(xiàn)Decorator的實現(xiàn)類似,但是在相似的程度上有所差別。Protection Proxy的實現(xiàn)可能與Decorator的實現(xiàn)差不多。另一方面, Remote Proxy不包含對實體的直接引用,而只是一個間接引用,如“主機I D,主機上的局部地址。”Virtual Proxy開始的時候使用一個間接引用,例如一個文件名,但最終將獲取并使用一個直接引用。
          Abstract Factory模式可以與Facade模式一起使用以提供一個接口,這一接口可用來以一種子系統(tǒng)獨立的方式創(chuàng)建子系統(tǒng)對象。Abstract Factory也可以代替Facade模式隱藏那些與平臺相關(guān)的類。Mediator模式與Facade模式的相似之處是,它抽象了一些已有的類的功能。然而,Mediator的目的是對同事之間的任意通訊進行抽象,通常集中不屬于任何單個對象的功能。Mediator的同事對象知道中介者并與它通信,而不是直接與其他同類對象通信。相對而言,F(xiàn)acade模式僅對子系統(tǒng)對象的接口進行抽象,從而使它們更容易使用;它并不定義新功能,子系統(tǒng)也不知道Facade的存在。通常來講,僅需要一個Facade對象,因此Facade對象通常屬于Singleton模式
          Chain of Responsibility常與Composite一起使用。這種情況下,一個構(gòu)件的父構(gòu)件可作為它的后繼。
          Composite抽象語法樹是一個復合模式的實例。Composite模式可被用來實現(xiàn)宏命令。
          Memento可用來保持某個狀態(tài),命令用這一狀態(tài)來取消它的效果。在被放入歷史表列前必須被拷貝的命令起到一種原型的作用。Memento常與迭代器模式一起使用。迭代器可使用一個Memento來捕獲一個迭代的狀態(tài)。迭代器在其內(nèi)部存儲Memento
          Flyweight說明了如何在抽象語法樹中共享終結(jié)符。
          Iterator解釋器可用一個迭代器遍歷該結(jié)構(gòu)。
          Visitor可用來在一個類中維護抽象語法樹中的各節(jié)點的行為。訪問者可以用于對一個由Composite模式定義的對象結(jié)構(gòu)進行操作。迭代器常被應(yīng)用到象復合這樣的遞歸結(jié)構(gòu)上。
          Facade與中介者的不同之處在于它是對一個對象子系統(tǒng)進行抽象,從而提供了一個更為方便的接口。它的協(xié)議是單向的,即Facade對象對這個子系統(tǒng)類提出請求,但反之則不行。相反, Mediator提供了各Colleague對象不支持或不能支持的協(xié)作行為,而且協(xié)議是多向的。Colleague可使用Observer模式與Mediator通信。
          Command命令可使用備忘錄來為可撤消的操作維護狀態(tài)。如前所述備忘錄可用于迭代
          Mediator通過封裝復雜的更新語義。
          Singleton使用Singleton模式來保證它是唯一的并且是可全局訪問的。
          Flyweight解釋了何時以及怎樣共享狀態(tài)對象。狀態(tài)對象通常是Singleton。Strategy對象經(jīng)常是很好的輕量級對象。
          Strategy模板方法使用繼承來改變算法的一部分。Strategy使用委托來改變整個算法。
          Interpreter訪問者可以用于解釋。
           
          創(chuàng)建型模式的討論
          用一個系統(tǒng)創(chuàng)建的那些對象的類對系統(tǒng)進行參數(shù)化有兩種常用方法。一種是生成創(chuàng)建對象的類的子類;這對應(yīng)于使用Factory Method模式。這種方法的主要缺點是,僅為了改變產(chǎn)品類,就可能需要創(chuàng)建一個新的子類。這樣的改變可能是級聯(lián)的(Cascade)。例如,如果產(chǎn)品的創(chuàng)建者本身是由一個工廠方法創(chuàng)建的,那么你也必須重定義它的創(chuàng)建者。另一種對系統(tǒng)進行參數(shù)化的方法更多的依賴于對象復合:定義一個對象負責明確產(chǎn)品對象的類,并將它作為該系統(tǒng)的參數(shù)。這是Abstract Factory、Builder和Prototype模式的關(guān)鍵特征。所有這三個模式都涉及到創(chuàng)建一個新的負責創(chuàng)建產(chǎn)品對象的“工廠對象”。Abstract Factory由這個工廠對象產(chǎn)生多個類的對象。Builder由這個工廠對象使用一個相對復雜的協(xié)議,逐步創(chuàng)建一個復雜產(chǎn)品。Prototype由該工廠對象通過拷貝原型對象來創(chuàng)建產(chǎn)品對象。在這種情況下,因為原型負責返回產(chǎn)品對象,所以工廠對象和原型是同一個對象。
           
          結(jié)構(gòu)型模式的討論
          你可能已經(jīng)注意到了結(jié)構(gòu)型模式之間的相似性,尤其是它們的參與者和協(xié)作之間的相似性。這可能是因為結(jié)構(gòu)型模式依賴于同一個很小的語言機制集合構(gòu)造代碼和對象:單繼承和多重繼承機制用于基于類的模式,而對象組合機制用于對象式模式。但是這些相似性掩蓋了這些模式的不同意圖。在本節(jié)中,我們將對比這些結(jié)構(gòu)型模式,使你對它們各自的優(yōu)點有所了解。
          AdapterBridge
          Adapter模式和Bridge模式具有一些共同的特征。它們都給另一對象提供了一定程度上的間接性,因而有利于系統(tǒng)的靈活性。它們都涉及到從自身以外的一個接口向這個對象轉(zhuǎn)發(fā)請求。這些模式的不同之處主要在于它們各自的用途。Bridge模式主要是為了解決兩個已有接口之間不匹配的問題。它不考慮這些接口是怎樣實現(xiàn)的,也不考慮它們各自可能會如何演化。這種方式不需要對兩個獨立設(shè)計的類中的任一個進行重新設(shè)計,就能夠使它們協(xié)同工作。另一方面, Bridge模式則對抽象接口與它的(可能是多個)實現(xiàn)部分進行橋接。雖然這一模式允許你修改實現(xiàn)它的類,它仍然為用戶提供了一個穩(wěn)定的接口。Bridge模式也會在系統(tǒng)演化時適應(yīng)新的實現(xiàn)。由于這些不同點, AdapterBridge模式通常被用于軟件生命周期的不同階段。當你發(fā)現(xiàn)兩個不兼容的類必須同時工作時,就有必要使用Adapter模式,其目的一般是為了避免代碼重復。此處耦合不可預見。相反, Bridge的使用者必須事先知道:一個抽象將有多個實現(xiàn)部分,并且抽象和實現(xiàn)兩者是獨立演化的。Adapter模式在類已經(jīng)設(shè)計好實施;而Bridge模式在設(shè)計類之實施。這并不意味著Adapter模式不如Bridge模式,只是因為它們針對了不同的問題。你可能認為facade是另外一組對象的適配器。但這種解釋忽視了一個事實:即facade定義一個新的接口,而Adapter則復用一個原有的接口。記住,適配器使兩個已有的接口協(xié)同工作,而不是定義一個全新的接口。
          CompositeDecoratorProxy
          Composite模式和Decorator模式具有類似的結(jié)構(gòu)圖,這說明它們都基于遞歸組合來組織可變數(shù)目的對象。這一共同點可能會使你認為,Decorator對象是一個退化的Composite,但這一觀點沒有領(lǐng)會Decorator模式要點。相似點僅止于遞歸組合,同樣,這是因為這兩個模式的目的不同。Decorator 旨在使你能夠不需要生成子類即可給對象添加職責。這就避免了靜態(tài)實現(xiàn)所有功能組合,從而導致子類急劇增加。Composite則有不同的目的,它旨在構(gòu)造類,使多個相關(guān)的對象能夠以統(tǒng)一的方式處理,而多重對象可以被當作一個對象來處理。它重點不在于修飾,而在于表示。盡管它們的目的截然不同,但卻具有互補性。因此Composite Decorator模式通常協(xié)同使用。在使用這兩種模式進行設(shè)計時,我們無需定義新的類,僅需將一些對象插接在一起即可構(gòu)建應(yīng)用。這時系統(tǒng)中將會有一個抽象類,它有一些Composite子類和Decorator子類,還有
          一些實現(xiàn)系統(tǒng)的基本構(gòu)建模塊。此時, composites decorator將擁有共同的接口。從Decorator模式的角度看,Composite是一個ConcreteComponet而從Composite模式的角度看,Decorator則是一個leaf。當然,他們不一定要同時使用,正如我們所見,它們的目的有很大的差別。
          另一種與Decorator模式結(jié)構(gòu)相似的模式是Proxy這兩種模式都描述了怎樣為對象提供一定程度上的間接引用,proxy Decorator對象的實現(xiàn)部分都保留了指向另一個對象的指針,它們向這個對象發(fā)送請求。然而同樣,它們具有不同的設(shè)計目的。像Decorator模式一樣, Proxy 模式構(gòu)成一個對象并為用戶提供一致的接口。但與Decorator模式不同的是,Proxy 模式不能動態(tài)地添加或分離性質(zhì),它也不是為遞歸組合而設(shè)
          計的。它的目的是,當直接訪問一個實體不方便或不符合需要時,為這個實體提供一個替代者,例如,實體在遠程設(shè)備上,訪問受到限制或者實體是持久存儲的。在Proxy模式中,實體定義了關(guān)鍵功能,而Proxy 提供(或拒絕)對它的訪問。在Decorator模式中,組件僅提供了部分功能,而一個或多個Decorator負責完成其他功能。Decorator模式適用于編譯時不能(至少不方便)確定對象的全部功能的情況。這種開放性使
          遞歸組合成為Decorator模式中一個必不可少的部分。而在Proxy模式中則不是這樣,因為Proxy模式強調(diào)一種關(guān)系(Proxy與它的實體之間的關(guān)系),這種關(guān)系可以靜態(tài)的表達。模式間的這些差異非常重要,因為它們針對了面向?qū)ο笤O(shè)計過程中一些特定的經(jīng)常發(fā)生問題的解決方法。但這并不意味著這些模式不能結(jié)合使用。可以設(shè)想有一個Proxy -Decorator,它可以給Proxy添加功能,或是一個Proxy - Proxy用來修飾一個遠程對象。盡管這種混合可能有用(我們手邊還沒有現(xiàn)成的例子),但它們可以分割成一些有用的模式。
           
          行為模式的討論
          封裝變化
          封裝變化是很多行為模式的主題。當一個程序的某個方面的特征經(jīng)常發(fā)生改變時,這些模式就定義一個封裝這個方面的對象。這樣當該程序的其他部分依賴于這個方面時,它們都可以與此對象協(xié)作。這些模式通常定義一個抽象類來描述這些封裝變化的對象,并且通常該模式依據(jù)這個對象來命名。例如,
          • 一個Strategy對象封裝一個算法
          • 一個State對象封裝一個與狀態(tài)相關(guān)的行為
          • 一個Mediator對象封裝對象間的協(xié)議
          • 一個Iterator對象封裝訪問和遍歷一個聚集對象中的各個構(gòu)件的方法。
          這些模式描述了程序中很可能會改變的方面。大多數(shù)模式有兩種對象:封裝該方面特征的新對象,和使用這些新的對象的已有對象。如果不使用這些模式的話,通常這些新對象的功能就會變成這些已有對象的難以分割的一部分。例如,一個Strategy的代碼可能會被嵌入到其Context類中,而一個State的代碼可能會在該狀態(tài)的Context類中直接實現(xiàn)。但不是所有的對象行為模式都象這樣分割功能。例如, Chain of Responsibility)可以處理任意數(shù)目的對象(即一個鏈),而所有這些對象可能已經(jīng)存在于系統(tǒng)中了。職責鏈說明了行為模式間的另一個不同點:并非所有的行為模式都定義類之間的靜態(tài)通信關(guān)系。職責鏈提供在數(shù)目可變的對象間進行通信的機制。其他模式涉及到一些作為參數(shù)傳遞的對象。
          對象作為參數(shù)
          一些模式引入總是被用作參數(shù)的對象。例如Visitor。一個Visitor對象是一個多態(tài)的Accept操作的參數(shù),這個操作作用于該Visitor對象訪問的對象。雖然以前通常代替Visitor模式的方法是將Visitor代碼分布在一些對象結(jié)構(gòu)的類中,但Visitor從來都不是它所訪問的對象的一部分。
          其他模式定義一些可作為令牌到處傳遞的對象,這些對象將在稍后被調(diào)用。CommandMemento都屬于這一類。在Command中,令牌代表一個請求;而在Memento中,它代表在一個對象在某個特定時刻的內(nèi)部狀態(tài)。在這兩種情況下,令牌都可以有一個復雜的內(nèi)部表示,但客戶并不會意識到這一點。但這里還有一些區(qū)別:在Command模式中多態(tài)這個主題也貫穿于其他種類的模式。AbstractFactory,Builder( 3 . 2 )Prototype都封裝了關(guān)于對象是如何創(chuàng)建的信息。Decorator封裝了可以被加入一個對象的職責。Bridge將一個抽象與它的實現(xiàn)分離,使它們可以各自獨立的變化。很重要,因為執(zhí)行Command對象是一個多態(tài)的操作。相反,Memento接口非常小,以至于備忘錄只能作為一個值傳遞。因此它很可能根本不給它的客戶提供任何多態(tài)操作。
          Mediator和Observer是相互競爭的模式。它們之間的差別是, Observer通過引入Observer和Subject對象來分布通信,而Mediatorr對象則封裝了其他對象間的通信。在Observer模式中,不存在封裝一個約束的單個對象,而必須是由Observer和Subject對象相互協(xié)作來維護這個約束。通信模式由觀察者和目標連接的方式?jīng)Q定:一個目標通常有多個觀察者,并且有時一個目標的觀察者也是另一個觀察者的目標。Mediator模式的目的是集中而不是分布。它將維護一個約束的職責直接放在一個中介者中。
          我們發(fā)現(xiàn)生成可復用的Observer和Subject比生成可復用的MMediator容易一些。Observer模式有利于Observer和Subject間的分割和松耦合,同時這將產(chǎn)生粒度更細,從而更易于復用的類。
          另一方面,相對于SubjectMediator中的通信流更容易理解。觀察者和目標通常在它們被創(chuàng)建后很快即被連接起來,并且很難看出此后它們在程序中是如何連接的。如果你了解Observerr模式,你將知道觀察者和目標間連接的方式是很重要的,并且你也知道尋找哪些連接。然而, Observer模式引入的間接性仍然會使得一個系統(tǒng)難以理解。
          對發(fā)送者和接收者解耦
          當合作的對象直接互相引用時,它們變得互相依賴,這可能會對一個系統(tǒng)的分層和重用性產(chǎn)生負面影響。命令、觀察者、中介者,和職責鏈等模式都涉及如何對發(fā)送者和接收者解耦,但它們又各有不同的權(quán)衡考慮。
          命令模式使用一個Command對象來定義一個發(fā)送者和一個接收者之間的綁定關(guān)系,從而支持解耦。
          觀察者模式通過定義一個接口來通知目標中發(fā)生的改變,從而將發(fā)送者(目標)與接收者(觀察者)解耦。Observer定義了一個比Command更松的發(fā)送者-接收者綁定,因為一個目標可能有多個觀察者,并且其數(shù)目可以在運行時變化,因此當對象間有數(shù)據(jù)依賴時,最好用觀察者模式來對它們進行解耦。中介者模式讓對象通過一個Mediator對象間接的互相引用,從而對它們解耦。因此各Colleague對象僅能通過Mediatorr接口相互交談。因為這個接口是固定的,為增加靈活性Mediator可能不得不實現(xiàn)它自己的分發(fā)策略。可以用一定方式對請求編碼并打包參數(shù),使得Colleague對象可以請求的操作數(shù)目不限。中介者模式可以減少一個系統(tǒng)中的子類生成,因為它將通信行為集中到一個類中而不是將其分布在各個子類中。然而,特別的分發(fā)策略通常會降低類型安全性。最后,職責鏈模式通過沿一個潛在接收者鏈傳遞請求而將發(fā)送者與接收者解耦,因為發(fā)送者和接收者之間的接口是固定的,職責鏈可能也需要一個定制的分發(fā)策略。因此它與Mediator一樣存在類型安全的問題。如果職責鏈已經(jīng)是系統(tǒng)結(jié)構(gòu)的一部分,同時在鏈上的多個對象中總有一個可以處理請求,那么職責鏈將是一個很好的將發(fā)送者和接收者解耦的方法。此外,因為鏈可以被簡單的改變和擴展,從而該模式提供了更大的靈活性。
          總結(jié),除了少數(shù)例外情況,各個行為設(shè)計模式之間是相互補充和相互加強的關(guān)系。職責鏈可以使用Command模式將請求表示為對象。Interpreter可以使用State模式定義語法分析上下文。迭代器可以遍歷一個聚合,而訪問者可以對它的每一個元素進行一個操作。行為模式也與能其他模式很好地協(xié)同工作。例如,一個使用Composite模式的系統(tǒng)可以使用一個訪問者對該復合的各成分進行一些操作。它可以使用職責鏈使得各成分可以通過它們的父類訪問某些全局屬性。它也可以使用Decorator對該復合的某些部分的這些屬性進行改寫。它可以使用Observer模式將一個對象結(jié)構(gòu)與另一個對象結(jié)構(gòu)聯(lián)系起來,可以使用State模式使得一個構(gòu)件在狀態(tài)改變時可以改變自身的行為。復合本身可以使用Builder中的方法創(chuàng)建,并且它可以被系統(tǒng)中的其他部分當作一個Prototype。設(shè)計良好的面向?qū)ο笫较到y(tǒng)通常有多個模式鑲嵌在其中,但其設(shè)計者卻未必使用這些術(shù)語進行思考。然而,在模式級別而不是在類或?qū)ο蠹墑e上的進行系統(tǒng)組裝可以使我們更方便地獲取同等的協(xié)同性。
          posted on 2015-07-17 16:40 wxb1988 閱讀(237) 評論(0)  編輯  收藏 所屬分類: Design pattern
          主站蜘蛛池模板: 大安市| 故城县| 太湖县| 隆化县| 永靖县| 遂宁市| 壶关县| 饶河县| 兰州市| 平顺县| 通州区| 湖州市| 错那县| 金阳县| 浪卡子县| 清水河县| 通州区| 呈贡县| 桂平市| 罗平县| 都昌县| 昌江| 陆川县| 休宁县| 工布江达县| 汽车| 乐昌市| 双鸭山市| 陇西县| 霞浦县| 探索| 勃利县| 西充县| 容城县| 苍山县| 望城县| 玉林市| 连平县| 密云县| 景宁| 台湾省|