设计模式及其应用场景
生活随笔
收集整理的這篇文章主要介紹了
设计模式及其应用场景
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Longronglin之設計模式: Christopher Alexander?說過:“每一個模式描述了一個在我們周圍不斷重復發生的問題,以及該問題的解決方案的核心。這樣,你就能一次又一次地使用該方案而不必做重復勞動”。 模式描述為:在一定環境中解決某一問題的方案,包括三個基本元素--問題,解決方案和環境。 閱讀類圖和對象圖請先學習UML 創建模式 結構模式 行為模式 創建模式:對類的實例化過程的抽象。一些系統在創建對象時,需要動態地決定怎樣創建對象,創建哪些對象,以及如何組合和表示這些對象。創建模式描述了怎樣構造和封裝這些動態的決定。包含類的創建模式和對象的創建模式。 結構模式:描述如何將類或對象結合在一起形成更大的結構。分為類的結構模式和對象的結構模式。類的結構模式使用繼承把類,接口等組合在一起,以形成更大的結構。類的結構模式是靜態的。對象的結構模式描述怎樣把各種不同類型的對象組合在一起,以實現新的功能的方法。對象的結構模式是動態的。 行為模式:對在不同的對象之間劃分責任和算法的抽象化。不僅僅是關于類和對象的,并是關于他們之間的相互作用。類的行為模式使用繼承關系在幾個類之間分配行為。對象的行為模式則使用對象的聚合來分配行為。 設計模式使用排行:
一 : 單例模式(Singleton) 單例模式:Singleton的作用是保證在應用程序中,一個類Class只有一個實例存在。并提供全局訪問。 結構: 賬本類:1 單一實例 2 給多個對象共享 3 自己創建 網頁計數器 public class?LazySingleton { private static LazySingleton newInstance?= null; private LazySingleton () { } public static synchronized??LazySingleton getInstance () { if (newInstance == null) { newInstance = new LazySingleton (); } return newInstance; } } singleton限制了實例個數,有利于gc的回收。 二:策略模式(Strategy)?? 策略模式:策略模式針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,從而使得它們可以相互替換。策略模式使得算法可以在不影響到客戶端的情況下發生變化。策略模式把行為和環境分開。環境類負責維持和查詢行為類,各種算法在具體的策略類中提供。由于算法和環境獨立開來,算法的增減,修改都不會影響到環境和客戶端。 結構: 使用QQ泡MM時使用外掛??客戶端 :ME?抽象類: 外掛 具體:策略(圖片,笑話,名人名言) 圖書銷售算法(不同書本折扣的算法) 三:原型模式(Prototype) 原型模式:通過給出一個原型對象來指明所要創建的對象的類型,然后用復制這個原型對象的方法創建出更多同類型的對象。原始模型模式允許動態的增加或減少產品類,產品類不需要非得有任何事先確定的等級結構,原始模型模式適用于任何的等級結構。缺點是每一個類都必須配備一個克隆方法 結構: 復印技術: 1 不是同一個對象 2 屬同類 短消息(轉發) 1-n個MM 因為Java中的提供clone()方法來實現對象的克隆,所以Prototype模式實現一下子變得很簡單. 四:門面模式(Fa?ade) 門面模式:外部與一個子系統的通信必須通過一個統一的門面對象進行。門面模式提供一個高層次的接口,使得子系統更易于使用,減少復雜性。每一個子系統只有一個門面類,而且此門面類只有一個實例,也就是說它是一個單例模式。但整個系統可以有多個門面類。 1?門面角色 2 子系統角色 結構: Facade典型應用就是數據庫JDBC的應用和Session的應用 ME---àMM---à(father,mum,sister,brother) 五:備忘錄模式(Memento) Memento模式:Memento對象是一個保存另外一個對象內部狀態拷貝的對象,這樣以后就可以將該對象恢復到原先保存的狀態。模式的用意是在不破壞封裝的條件下,將一個對象的狀態捕捉住,并外部化,存儲起來,從而可以在將來合適的時候把這個對象還原到存儲起來的狀態。模式所涉及的角色有三個,備忘錄角色、發起人角色和負責人角色。 備忘錄角色的作用: (1)?將發起人對象的內部狀態存儲起來,備忘錄可以根據發起人對象的判斷來決定存儲多少發起人對象的內部狀態。 (2)?備忘錄可以保護其內容不被發起人對象之外的任何對象所讀取。 發起人角色的作用: (1)?創建一個含有當前內部狀態的備忘錄對象。 (2)?使用備忘錄對象存儲其內部狀態。 負責人角色的作用: (1)?負責保存備忘錄對象。 (2)?不檢查備忘錄對象的內容 結構: 備份系統時使用 GHOST 六 : 命令模式(Command) 命令模式:命令模式把一個請求或者操作封裝到一個對象中。命令模式把發出命令的責任和執行命令的責任分割開,委派給不同的對象。命令模式允許請求的一方和發送的一方獨立開來,使得請求的一方不必知道接收請求的一方的接口,更不必知道請求是怎么被接收,以及操作是否執行,何時被執行以及是怎么被執行的。系統支持命令的撤消。 結構: MM(客戶端)--àME(請求者)--à命令角色--à(具體命令)-à代理處(接收者)--àMM 上網 IE 輸入 http地址?發送命令 七: 解釋器(Interpreter) 解釋器模式:給定一個語言后,解釋器模式可以定義出其文法的一種表示,并同時提供一個解釋器。客戶端可以使用這個解釋器來解釋這個語言中的句子。解釋器模式將描述怎樣在有了一個簡單的文法后,使用模式設計解釋這些語句。在解釋器模式里面提到的語言是指任何解釋器對象能夠解釋的任何組合。在解釋器模式中需要定義一個代表文法的命令類的等級結構,也就是一系列的組合規則。每一個命令對象都有一個解釋方法,代表對命令對象的解釋。命令對象的等級結構中的對象的任何排列組合都是一個語言。 結構: 編譯原理之編譯器 文言文注釋:一段文言文,將它翻譯成白話文 八:調停者模式(Mediator) 調停者模式:包裝了一系列對象相互作用的方式,使得這些對象不必相互明顯作用。從而使他們可以松散偶合。當某些對象之間的作用發生改變時,不會立即影響其他的一些對象之間的作用。保證這些作用可以彼此獨立的變化。調停者模式將多對多的相互作用轉化為一對多的相互作用。調停者模式將對象的行為和協作抽象化,把對象在小尺度的行為上與其他對象的相互作用分開處理。 結構: 法院和原告,被告的關系 九:責任鏈模式(CHAIN OF RESPONSIBLEITY) 責任鏈模式:執行者的不確定性 在責任鏈模式中,很多對象由每一個對象對其下家的引用而接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。客戶并不知道鏈上的哪一個對象最終處理這個請求,系統可以在不影響客戶端的情況下動態的重新組織鏈和分配責任。處理者有兩個選擇:承擔責任或者把責任推給下家。一個請求可以最終不被任何接收端對象所接受。 結構: 典型的對象結構: 喝酒時通過成語接龍決定誰喝酒(馬到成功-功不可沒-沒完沒了) 十:工廠模式(Factory) 工廠模式:定義一個用于創建對象的接口,讓接口子類通過工廠方法決定實例化哪一個類。 結構: 水果園—〉(葡萄園,蘋果園)--〉(葡萄,蘋果)(各自生產) 十一:抽象工廠模式(Abstract Factory) 抽象工廠模式:提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。 結構: 女媧造人---〉(陰,陽)--〉(人,獸)----〉(男人,女人,公獸,母獸)(人和獸屬于不同的產品類) 十二:建造模式(Builder) 建造模式:將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示.Builder模式是一步一步創建一個復雜的對象,它允許用戶可以只通過指定復雜對象的類型和內容就可以構建它們.用戶不知道內部的具體構建細節.Builder模式是非常類似抽象工廠模式,細微的區別大概只有在反復使用中才能體會到。 將產品的內部表象和產品的生成過程分割開來,從而使一個建造過程生成具有不同的內部表象的產品對象。建造模式使得產品內部表象可以獨立的變化,客戶不必知道產品內部組成的細節。建造模式可以強制實行一種分步驟進行的建造過程。 結構: 交互圖: 汽車制造 十三:合成模式(Composite) 合成模式:將對象以樹形結構組織起來,以達成“部分-整體” 的層次結構,使得客戶端對單個對象和組合對象的使用具有一致性. 合成模式就是一個處理對象的樹結構的模式。合成模式把部分與整體的關系用樹結構表示出來。合成模式使得客戶端把一個個單獨的成分對象和由他們復合而成的合成對象同等看待。 結構: windows的目錄樹(文件系統) 十四:裝飾模式(DECORATOR) 裝飾模式:裝飾模式以對客戶端透明的方式擴展對象的功能,是繼承關系的一個替代方案,提供比繼承更多的靈活性。動態給一個對象增加功能,這些功能可以再動態的撤消。增加由一些基本功能的排列組合而產生的非常大量的功能。 使用Decorator的理由是:這些功能需要由用戶動態決定加入的方式和時機.Decorator提供了"即插即用"的方法,在運行期間決定何時增加何種功能. 結構: 在visio中文件可以使用背景進行裝飾 變廢為寶 十五:設計模式之Adapter(適配器)???? 適配器模式:把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口原因不匹配而無法一起工作的兩個類能夠一起工作。適配類可以根據參數返還一個合適的實例給客戶端 將兩個不兼容的類糾合在一起使用,屬于結構型模式,需要Adaptee(被適配者)和Adaptor(適配器)兩個身份. 為何使用? 我們經常碰到要將兩個沒有關系的類組合在一起使用,第一解決方案是:修改各自類的接口,但是如果我們沒有源代碼,或者,我們不愿意為了一個應用而修改各自的接口。 怎么辦? 使用Adapter,在這兩種接口之間創建一個混合接口(混血兒). 如何使用? 實現Adapter方式,其實"think in Java"的"類再生"一節中已經提到,有兩種方式:組合(composition)和繼承(inheritance). 結構: 對象結構: 充電器(手機和220V電壓) jdbc-odbc橋 十六:橋梁模式(Bridge) 橋梁模式:將抽象化與實現化脫耦,使得二者可以獨立的變化。也就是說將他們之間的強關聯變成弱關聯,也就是指在一個軟件系統的抽象化和實現化之間使用組合/聚合關系而不是繼承關系,從而使兩者可以獨立的變化。 結構: jdbc驅動程序 十七:代理模式(Proxy) 代理模式:代理模式給某一個對象提供一個代理對象,并由代理對象控制對源對象的引用。代理就是一個人或一個機構代表另一個人或者一個機構采取行動。某些情況下,客戶不想或者不能夠直接引用一個對象,代理對象可以在客戶和目標對象直接起到中介的作用。客戶端分辨不出代理主題對象與真實主題對象。代理模式可以并不知道真正的被代理對象,而僅僅持有一個被代理對象的接口,這時候代理對象不能夠創建被代理對象,被代理對象必須有系統的其他角色代為創建并傳入。 結構: 運行時的代理結構: 用代理服務器連接出網 銷售代理(廠商)律師代理(客戶) foxmail 槍手 十八:享元模式(Flyweight) 享元模式以共享的方式高效的支持大量的細粒度對象。享元模式能做到共享的關鍵是區分內蘊狀態和外蘊狀態。內蘊狀態存儲在享元內部,不會隨環境的改變而有所不同。外蘊狀態是隨環境的改變而改變的。外蘊狀態不能影響內蘊狀態,它們是相互獨立的。將可以共享的狀態和不可以共享的狀態從常規類中區分開來,將不可以共享的狀態從類里剔除出去。客戶端不可以直接創建被共享的對象,而應當使用一個工廠對象負責創建被共享的對象。享元模式大幅度的降低內存中對象的數量。 結構: 共享方法: 字體的26個字母和各自的斜體等 十九:狀態模式(State) 狀態模式:狀態模式允許一個對象在其內部狀態改變的時候改變行為。這個對象看上去象是改變了它的類一樣。狀態模式把所研究的對象的行為包裝在不同的狀態對象里,每一個狀態對象都屬于一個抽象狀態類的一個子類。狀態模式的意圖是讓一個對象在其內部狀態改變的時候,其行為也隨之改變。狀態模式需要對每一個系統可能取得的狀態創立一個狀態類的子類。當系統的狀態變化時,系統便改變所選的子類。 結構: 人心情不同時表現不同有不同的行為 編鐘 登錄login?logout 二十:觀察者模式(Observer) 觀察者模式:觀察者模式定義了一種一隊多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態上發生變化時,會通知所有觀察者對象,使他們能夠自動更新自己。發布訂閱。 結構: 公司郵件系統everyone@sina.com的應用。當公司員工向這個郵箱發郵件時會發給公司的每一個員工。如果設置了Outlook則會及時收到通知。 接收到短消息 二十一:模板方法模式(Template) 模板方法模式:模板方法模式準備一個抽象類,將部分邏輯以具體方法以及具體構造子的形式實現,然后聲明一些抽象方法來迫使子類實現剩余的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩余的邏輯有不同的實現。先制定一個頂級邏輯框架,而將邏輯的細節留給具體的子類去實現。 結構: 使用網頁設計時使用的模板架構網頁(骨架) 算法的各個邏輯系統 二十二:訪問者模式(Visitor) 訪問者模式:訪問者模式的目的是封裝一些施加于某種數據結構元素之上的操作。一旦這些操作需要修改的話,接受這個操作的數據結構可以保持不變。訪問者模式適用于數據結構相對未定的系統,它把數據結構和作用于結構上的操作之間的耦合解脫開,使得操作集合可以相對自由的演化。訪問者模式使得增加新的操作變的很容易,就是增加一個新的訪問者類。訪問者模式將有關的行為集中到一個訪問者對象中,而不是分散到一個個的節點類中。當使用訪問者模式時,要將盡可能多的對象瀏覽邏輯放在訪問者類中,而不是放到它的子類中。訪問者模式可以跨過幾個類的等級結構訪問屬于不同的等級結構的成員類。 結構: 電腦銷售系統: 訪問者(自己)---〉電腦配置系統(主板,CPU,內存。。。。。。) 二十三:迭代子模式(Iterator) 迭代子模式:迭代子模式可以順序訪問一個聚集中的元素而不必暴露聚集的內部表象。多個對象聚在一起形成的總體稱之為聚集,聚集對象是能夠包容一組對象的容器對象。迭代子模式將迭代邏輯封裝到一個獨立的子對象中,從而與聚集本身隔開。迭代子模式簡化了聚集的界面。每一個聚集對象都可以有一個或一個以上的迭代子對象,每一個迭代子的迭代狀態可以是彼此獨立的。迭代算法可以獨立于聚集角色變化。 結構: 查詢數據庫,返回結果集(map, list, set) 二十四:MVC模式 MVC模式:它強制性的使應用程序的輸入、處理和輸出分開。使用MVC應用程序被分成三個核心部件:模型、視圖、控制器。它們各自處理自己的任務。相互通信。 MVC還使用了的設計模式,如:用來指定視圖缺省控制器的Factory Method和用來增加視圖滾動的Decorator。但是MVC的主要關系還是由Observer、Composite和Strategy三個設計模式給出的。 struts圖解:其中不同顏色代表MVC的不同部分:紅色(控制器)、紫色(模型)和綠色(視圖) struts應用 spring 應用 設計模式的使用: 模式關系圖: 個人圖解:(^_^)沒有看到下面的圖解時想的 門面模式可以使用一個單體實例對象實現 抽象工廠可以創建單體實例 也可以使用工廠方法也可以使用原型創建對象實例 模板方法可以使用工廠方法實現創建實例使用策略模式定義算法使用 策略模式可以使用享元實例 與裝飾模式可以相互使用 享元模式被狀態,解釋器,合成等模式。共享 解釋器模式通過訪問模式實現其動作 通過享元實現基本元素的共享 裝飾模式使用策略可以實現不同的裝飾效果 迭代器模式通過訪問者訪問對象元素 通過備忘錄模式實現紀錄的記憶功能 訪問合成的對象 命令模式通過使用備忘錄模式(參考) 執行命令 建造模式可以使用合成模式創建合成產品 責任鏈模式使用合成模式定義鏈 調停者模式可以使觀察者的觀察受其影響 實際圖解: 關模式(相互關系): Abstract Factory類通常用工廠方法(Factory Method)實現,但它們也可以用Prototype實現。一個具體的工廠通常是一個單件Singleton。Abstract Factory與Builder相似,因為它也可以創建復雜對象。主要的區別是Builder模式著重于一步步構造一個復雜對象。而Abstract Factory著重于多個系列的產品對象(簡單的或是復雜的)。Builder在最后一步返回產品,而對于Abstract Factory來說,產品是立即返回的。Composite通常是用Builder生成的。 Factory方法通常在Template Methods中被調用。Prototypes不需要創建Creator的子類。但是,它們通常要求一個針對Product類的Initialize操作。Creator使用Initialize來初始化對象。Factory Method不需要這樣的操作。多態迭代器靠Factory Method來例化適當的迭代器子類。Factory Method模式常被模板方法調用。 Prototype和Abstract Factory模式在某種方面是相互競爭的。但是它們也可以一起使用。Abstract Factory可以存儲一個被克隆的原型的集合,并且返回產品對象。大量使用Composite和Decorator模式的設計通常也可從Prototype模式處獲益。 很多模式可以使用Singleton模式實現。參見Abstract Factory、Builder,和Prototype。 模式Bridge的結構與對象適配器類似,但是Bridge模式的出發點不同;Bridge目的是將接口部分和實現部分分離,從而對它們可以較為容易也相對獨立的加以改變。而Adapter則意味著改變一個已有對象的接口。 Decorator模式增強了其他對象的功能而同時又不改變它的接口。因此Decorator對應用程序的透明性比適配器要好。結果是Decorator支持遞歸組合,而純粹使用適配器是不可能實現這一點的。模式Proxy在不改變它的接口的條件下,為另一個對象定義了一個代理。Abstract Factory模式可以用來創建和配置一個特定的Bridge模式。 Adapter模式用來幫助無關的類協同工作,它通常在系統設計完成后才會被使用。然而,Bridge模式則是在系統開始時就被使用,它使得抽象接口和實現部分可以獨立進行改變。適配器Adapter為它所適配的對象提供了一個不同的接口。相反,代理提供了與它的實體相同的接口。然而,用于訪問保護的代理可能會拒絕執行實體會執行的操作,因此,它的接口實際上可能只是實體接口的一個子集。 Decorator模式經常與Composite模式一起使用。當裝飾和組合一起使用時,它們通常有一個公共的父類。因此裝飾必須支持具有Add、Remove和GetChild?操作。Decorator模式不同于Adapter模式,因為裝飾僅改變對象的職責而不改變它的接口;而適配器將給對象一個全新的接口。Composite模式可以將裝飾視為一個退化的、僅有一個組件的組合。然而,裝飾僅給對象添加一些額外的職責—它的目的不在于對象聚集。用一個裝飾你可以改變對象的外表;而Strategy模式使得你可以改變對象的內核。這是改變對象的兩種途徑。 盡管Decorator的實現部分與Proxy相似,但Decorator的目的不一樣。Decorator為對象添加一個或多個功能,而代理則控制對對象的訪問。代理的實現Decorator的實現類似,但是在相似的程度上有所差別。Protection?Proxy的實現可能與Decorator的實現差不多。另一方面,?Remote Proxy不包含對實體的直接引用,而只是一個間接引用,如“主機I D,主機上的局部地址。”Virtual Proxy開始的時候使用一個間接引用,例如一個文件名,但最終將獲取并使用一個直接引用。 Abstract Factory模式可以與Facade模式一起使用以提供一個接口,這一接口可用來以一種子系統獨立的方式創建子系統對象。Abstract Factory也可以代替Facade模式隱藏那些與平臺相關的類。Mediator模式與Facade模式的相似之處是,它抽象了一些已有的類的功能。然而,Mediator的目的是對同事之間的任意通訊進行抽象,通常集中不屬于任何單個對象的功能。Mediator的同事對象知道中介者并與它通信,而不是直接與其他同類對象通信。相對而言,Facade模式僅對子系統對象的接口進行抽象,從而使它們更容易使用;它并不定義新功能,子系統也不知道Facade的存在。通常來講,僅需要一個Facade對象,因此Facade對象通常屬于Singleton模式 Chain of Responsibility常與Composite一起使用。這種情況下,一個構件的父構件可作為它的后繼。 Composite抽象語法樹是一個復合模式的實例。Composite模式可被用來實現宏命令。 Memento可用來保持某個狀態,命令用這一狀態來取消它的效果。在被放入歷史表列前必須被拷貝的命令起到一種原型的作用。Memento常與迭代器模式一起使用。迭代器可使用一個Memento來捕獲一個迭代的狀態。迭代器在其內部存儲Memento。 Flyweight說明了如何在抽象語法樹中共享終結符。 Iterator解釋器可用一個迭代器遍歷該結構。 Visitor可用來在一個類中維護抽象語法樹中的各節點的行為。訪問者可以用于對一個由Composite模式定義的對象結構進行操作。迭代器常被應用到象復合這樣的遞歸結構上。 Facade與中介者的不同之處在于它是對一個對象子系統進行抽象,從而提供了一個更為方便的接口。它的協議是單向的,即Facade對象對這個子系統類提出請求,但反之則不行。相反,?Mediator提供了各Colleague對象不支持或不能支持的協作行為,而且協議是多向的。Colleague可使用Observer模式與Mediator通信。 Command命令可使用備忘錄來為可撤消的操作維護狀態。如前所述備忘錄可用于迭代。 Mediator通過封裝復雜的更新語義。 Singleton使用Singleton模式來保證它是唯一的并且是可全局訪問的。 Flyweight解釋了何時以及怎樣共享狀態對象。狀態對象通常是Singleton。Strategy對象經常是很好的輕量級對象。 Strategy模板方法使用繼承來改變算法的一部分。Strategy使用委托來改變整個算法。 Interpreter訪問者可以用于解釋。 創建型模式的討論 用一個系統創建的那些對象的類對系統進行參數化有兩種常用方法。一種是生成創建對象的類的子類;這對應于使用Factory Method模式。這種方法的主要缺點是,僅為了改變產品類,就可能需要創建一個新的子類。這樣的改變可能是級聯的(Cascade)。例如,如果產品的創建者本身是由一個工廠方法創建的,那么你也必須重定義它的創建者。另一種對系統進行參數化的方法更多的依賴于對象復合:定義一個對象負責明確產品對象的類,并將它作為該系統的參數。這是Abstract Factory、Builder和Prototype模式的關鍵特征。所有這三個模式都涉及到創建一個新的負責創建產品對象的“工廠對象”。Abstract Factory由這個工廠對象產生多個類的對象。Builder由這個工廠對象使用一個相對復雜的協議,逐步創建一個復雜產品。Prototype由該工廠對象通過拷貝原型對象來創建產品對象。在這種情況下,因為原型負責返回產品對象,所以工廠對象和原型是同一個對象。 結構型模式的討論 你可能已經注意到了結構型模式之間的相似性,尤其是它們的參與者和協作之間的相似性。這可能是因為結構型模式依賴于同一個很小的語言機制集合構造代碼和對象:單繼承和多重繼承機制用于基于類的模式,而對象組合機制用于對象式模式。但是這些相似性掩蓋了這些模式的不同意圖。在本節中,我們將對比這些結構型模式,使你對它們各自的優點有所了解。 Adapter與Bridge Adapter模式和Bridge模式具有一些共同的特征。它們都給另一對象提供了一定程度上的間接性,因而有利于系統的靈活性。它們都涉及到從自身以外的一個接口向這個對象轉發請求。這些模式的不同之處主要在于它們各自的用途。Bridge模式主要是為了解決兩個已有接口之間不匹配的問題。它不考慮這些接口是怎樣實現的,也不考慮它們各自可能會如何演化。這種方式不需要對兩個獨立設計的類中的任一個進行重新設計,就能夠使它們協同工作。另一方面,?Bridge模式則對抽象接口與它的(可能是多個)實現部分進行橋接。雖然這一模式允許你修改實現它的類,它仍然為用戶提供了一個穩定的接口。Bridge模式也會在系統演化時適應新的實現。由于這些不同點,?Adapter和Bridge模式通常被用于軟件生命周期的不同階段。當你發現兩個不兼容的類必須同時工作時,就有必要使用Adapter模式,其目的一般是為了避免代碼重復。此處耦合不可預見。相反,?Bridge的使用者必須事先知道:一個抽象將有多個實現部分,并且抽象和實現兩者是獨立演化的。Adapter模式在類已經設計好后實施;而Bridge模式在設計類之前實施。這并不意味著Adapter模式不如Bridge模式,只是因為它們針對了不同的問題。你可能認為facade是另外一組對象的適配器。但這種解釋忽視了一個事實:即facade定義一個新的接口,而Adapter則復用一個原有的接口。記住,適配器使兩個已有的接口協同工作,而不是定義一個全新的接口。 Composite、Decorator與Proxy Composite模式和Decorator模式具有類似的結構圖,這說明它們都基于遞歸組合來組織可變數目的對象。這一共同點可能會使你認為,Decorator對象是一個退化的Composite,但這一觀點沒有領會Decorator模式要點。相似點僅止于遞歸組合,同樣,這是因為這兩個模式的目的不同。Decorator?旨在使你能夠不需要生成子類即可給對象添加職責。這就避免了靜態實現所有功能組合,從而導致子類急劇增加。Composite則有不同的目的,它旨在構造類,使多個相關的對象能夠以統一的方式處理,而多重對象可以被當作一個對象來處理。它重點不在于修飾,而在于表示。盡管它們的目的截然不同,但卻具有互補性。因此Composite?和Decorator模式通常協同使用。在使用這兩種模式進行設計時,我們無需定義新的類,僅需將一些對象插接在一起即可構建應用。這時系統中將會有一個抽象類,它有一些Composite子類和Decorator子類,還有 一些實現系統的基本構建模塊。此時,?composites?和decorator將擁有共同的接口。從Decorator模式的角度看,Composite是一個ConcreteComponet。而從Composite模式的角度看,Decorator則是一個leaf。當然,他們不一定要同時使用,正如我們所見,它們的目的有很大的差別。 另一種與Decorator模式結構相似的模式是Proxy這兩種模式都描述了怎樣為對象提供一定程度上的間接引用,proxy?和Decorator對象的實現部分都保留了指向另一個對象的指針,它們向這個對象發送請求。然而同樣,它們具有不同的設計目的。像Decorator模式一樣,?Proxy?模式構成一個對象并為用戶提供一致的接口。但與Decorator模式不同的是,?Proxy?模式不能動態地添加或分離性質,它也不是為遞歸組合而設 計的。它的目的是,當直接訪問一個實體不方便或不符合需要時,為這個實體提供一個替代者,例如,實體在遠程設備上,訪問受到限制或者實體是持久存儲的。在Proxy模式中,實體定義了關鍵功能,而Proxy?提供(或拒絕)對它的訪問。在Decorator模式中,組件僅提供了部分功能,而一個或多個Decorator負責完成其他功能。Decorator模式適用于編譯時不能(至少不方便)確定對象的全部功能的情況。這種開放性使 遞歸組合成為Decorator模式中一個必不可少的部分。而在Proxy模式中則不是這樣,因為Proxy模式強調一種關系(Proxy與它的實體之間的關系),這種關系可以靜態的表達。模式間的這些差異非常重要,因為它們針對了面向對象設計過程中一些特定的經常發生問題的解決方法。但這并不意味著這些模式不能結合使用。可以設想有一個Proxy -?Decorator,它可以給Proxy添加功能,或是一個Proxy - Proxy用來修飾一個遠程對象。盡管這種混合可能有用(我們手邊還沒有現成的例子),但它們可以分割成一些有用的模式。 行為模式的討論 封裝變化 封裝變化是很多行為模式的主題。當一個程序的某個方面的特征經常發生改變時,這些模式就定義一個封裝這個方面的對象。這樣當該程序的其他部分依賴于這個方面時,它們都可以與此對象協作。這些模式通常定義一個抽象類來描述這些封裝變化的對象,并且通常該模式依據這個對象來命名。例如, ??一個Strategy對象封裝一個算法 ??一個State對象封裝一個與狀態相關的行為 ??一個Mediator對象封裝對象間的協議 ??一個Iterator對象封裝訪問和遍歷一個聚集對象中的各個構件的方法。 這些模式描述了程序中很可能會改變的方面。大多數模式有兩種對象:封裝該方面特征的新對象,和使用這些新的對象的已有對象。如果不使用這些模式的話,通常這些新對象的功能就會變成這些已有對象的難以分割的一部分。例如,一個Strategy的代碼可能會被嵌入到其Context類中,而一個State的代碼可能會在該狀態的Context類中直接實現。但不是所有的對象行為模式都象這樣分割功能。例如,?Chain of Responsibility)可以處理任意數目的對象(即一個鏈),而所有這些對象可能已經存在于系統中了。職責鏈說明了行為模式間的另一個不同點:并非所有的行為模式都定義類之間的靜態通信關系。職責鏈提供在數目可變的對象間進行通信的機制。其他模式涉及到一些作為參數傳遞的對象。 對象作為參數 一些模式引入總是被用作參數的對象。例如Visitor。一個Visitor對象是一個多態的Accept操作的參數,這個操作作用于該Visitor對象訪問的對象。雖然以前通常代替Visitor模式的方法是將Visitor代碼分布在一些對象結構的類中,但Visitor從來都不是它所訪問的對象的一部分。 其他模式定義一些可作為令牌到處傳遞的對象,這些對象將在稍后被調用。Command和Memento都屬于這一類。在Command中,令牌代表一個請求;而在Memento中,它代表在一個對象在某個特定時刻的內部狀態。在這兩種情況下,令牌都可以有一個復雜的內部表示,但客戶并不會意識到這一點。但這里還有一些區別:在Command模式中多態這個主題也貫穿于其他種類的模式。AbstractFactory,Builder( 3 . 2 )和Prototype都封裝了關于對象是如何創建的信息。Decorator封裝了可以被加入一個對象的職責。Bridge將一個抽象與它的實現分離,使它們可以各自獨立的變化。很重要,因為執行Command對象是一個多態的操作。相反,Memento接口非常小,以至于備忘錄只能作為一個值傳遞。因此它很可能根本不給它的客戶提供任何多態操作。 Mediator和Observer是相互競爭的模式。它們之間的差別是, Observer通過引入Observer和Subject對象來分布通信,而Mediatorr對象則封裝了其他對象間的通信。在Observer模式中,不存在封裝一個約束的單個對象,而必須是由Observer和Subject對象相互協作來維護這個約束。通信模式由觀察者和目標連接的方式決定:一個目標通常有多個觀察者,并且有時一個目標的觀察者也是另一個觀察者的目標。Mediator模式的目的是集中而不是分布。它將維護一個約束的職責直接放在一個中介者中。 我們發現生成可復用的Observer和Subject比生成可復用的MMediator容易一些。Observer模式有利于Observer和Subject間的分割和松耦合,同時這將產生粒度更細,從而更易于復用的類。 另一方面,相對于Subject,Mediator中的通信流更容易理解。觀察者和目標通常在它們被創建后很快即被連接起來,并且很難看出此后它們在程序中是如何連接的。如果你了解Observerr模式,你將知道觀察者和目標間連接的方式是很重要的,并且你也知道尋找哪些連接。然而, Observer模式引入的間接性仍然會使得一個系統難以理解。 對發送者和接收者解耦 當合作的對象直接互相引用時,它們變得互相依賴,這可能會對一個系統的分層和重用性產生負面影響。命令、觀察者、中介者,和職責鏈等模式都涉及如何對發送者和接收者解耦,但它們又各有不同的權衡考慮。 命令模式使用一個Command對象來定義一個發送者和一個接收者之間的綁定關系,從而支持解耦。 觀察者模式通過定義一個接口來通知目標中發生的改變,從而將發送者(目標)與接收者(觀察者)解耦。Observer定義了一個比Command更松的發送者-接收者綁定,因為一個目標可能有多個觀察者,并且其數目可以在運行時變化,因此當對象間有數據依賴時,最好用觀察者模式來對它們進行解耦。中介者模式讓對象通過一個Mediator對象間接的互相引用,從而對它們解耦。因此各Colleague對象僅能通過Mediatorr接口相互交談。因為這個接口是固定的,為增加靈活性Mediator可能不得不實現它自己的分發策略。可以用一定方式對請求編碼并打包參數,使得Colleague對象可以請求的操作數目不限。中介者模式可以減少一個系統中的子類生成,因為它將通信行為集中到一個類中而不是將其分布在各個子類中。然而,特別的分發策略通常會降低類型安全性。最后,職責鏈模式通過沿一個潛在接收者鏈傳遞請求而將發送者與接收者解耦,因為發送者和接收者之間的接口是固定的,職責鏈可能也需要一個定制的分發策略。因此它與Mediator一樣存在類型安全的問題。如果職責鏈已經是系統結構的一部分,同時在鏈上的多個對象中總有一個可以處理請求,那么職責鏈將是一個很好的將發送者和接收者解耦的方法。此外,因為鏈可以被簡單的改變和擴展,從而該模式提供了更大的靈活性。 總結,除了少數例外情況,各個行為設計模式之間是相互補充和相互加強的關系。職責鏈可以使用Command模式將請求表示為對象。Interpreter可以使用State模式定義語法分析上下文。迭代器可以遍歷一個聚合,而訪問者可以對它的每一個元素進行一個操作。行為模式也與能其他模式很好地協同工作。例如,一個使用Composite模式的系統可以使用一個訪問者對該復合的各成分進行一些操作。它可以使用職責鏈使得各成分可以通過它們的父類訪問某些全局屬性。它也可以使用Decorator對該復合的某些部分的這些屬性進行改寫。它可以使用Observer模式將一個對象結構與另一個對象結構聯系起來,可以使用State模式使得一個構件在狀態改變時可以改變自身的行為。復合本身可以使用Builder中的方法創建,并且它可以被系統中的其他部分當作一個Prototype。設計良好的面向對象式系統通常有多個模式鑲嵌在其中,但其設計者卻未必使用這些術語進行思考。然而,在模式級別而不是在類或對象級別上的進行系統組裝可以使我們更方便地獲取同等的協同性。 參考文獻: http://blog.csdn.net/airhand/ http://blog.csdn.net/bloom121/ http://blog.csdn.net/laurecn/ http://blog.csdn.net/legendinfo/ http://www-128.ibm.com/developerworks/cn/java/l-struts1-1/ 《Design Patterns》 《Java與模式》 《設計模式:可復用面向對象軟件的基礎》 注:轉載請注明出處和參考文獻(本文的原著),請遵守相關法律,僅供學習研究。不得用于商業目的。
| 頻率 | 所屬類型 | 模式名稱 | 模式 | 簡單定義 |
| 5 | 創建型 | Singleton | 單例 | 保證一個類只有一個實例,并提供一個訪問它的全局訪問點。 |
| 5 | 結構型 | Composite | 組合模式 | 將對象組合成樹形結構以表示部分整體的關系,Composite使得用戶對單個對象和組合對象的使用具有一致性。 |
| 5 | 結構型 | FACADE | 外觀 | 為子系統中的一組接口提供一致的界面,facade提供了一高層接口,這個接口使得子系統更容易使用。 |
| 5 | 結構型 | Proxy | 代理 | 為其他對象提供一種代理以控制對這個對象的訪問 |
| 5 | 行為型 | Iterator | 迭代器 | 提供一個方法順序訪問一個聚合對象的各個元素,而又不需要暴露該對象的內部表示。 |
| 5 | 行為型 | Observer | 觀察者 | 定義對象間一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知自動更新。 |
| 5 | 行為型 | Template Method | 模板方法 | 定義一個操作中的算法的骨架,而將一些步驟延遲到子類中,Template Method使得子類可以不改變一個算法的結構即可以重定義該算法得某些特定步驟。 |
| 4 | 創建型 | Abstract Factory | 抽象工廠 | 提供一個創建一系列相關或相互依賴對象的接口,而無須指定它們的具體類。 |
| 4 | 創建型 | Factory Method | 工廠方法 | 定義一個用于創建對象的接口,讓子類決定實例化哪一個類,Factory Method使一個類的實例化延遲到了子類。 |
| 4 | 結構型 | Adapter | 適配器 | 將一類的接口轉換成客戶希望的另外一個接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些類可以一起工作。 |
| 4 | 結構型 | Decorator | 裝飾 | 動態地給一個對象增加一些額外的職責,就增加的功能來說,Decorator模式相比生成子類更加靈活。 |
| 4 | 行為型 | Command | 命令 | 將一個請求封裝為一個對象,從而使你可以用不同的請求對客戶進行參數化,對請求排隊和記錄請求日志,以及支持可撤銷的操作。 |
| 4 | 行為型 | State | 狀態 | 允許對象在其內部狀態改變時改變他的行為。對象看起來似乎改變了他的類。 |
| 4 | 行為型 | Strategy | 策略模式 | 定義一系列的算法,把他們一個個封裝起來,并使他們可以互相替換,本模式使得算法可以獨立于使用它們的客戶。 |
| 3 | 創建型 | Builder | 生成器 | 將一個復雜對象的構建與他的表示相分離,使得同樣的構建過程可以創建不同的表示。 |
| 3 | 結構型 | Bridge | 橋接 | 將抽象部分與它的實現部分相分離,使他們可以獨立的變化。 |
| 3 | 行為型 | China?of Responsibility | 職責鏈 | 使多個對象都有機會處理請求,從而避免請求的送發者和接收者之間的耦合關系 |
| 2 | 創建型 | Prototype | 原型 | 用原型實例指定創建對象的種類,并且通過拷貝這些原型來創建新的對象。 |
| 2 | 結構型 | Flyweight | 享元 | 享元模式以共享的方式高效的支持大量的細粒度對象。享元模式能做到共享的關鍵是區分內蘊狀態和外蘊狀態。內蘊狀態存儲在享元內部,不會隨環境的改變而有所不同。外蘊狀態是隨環境的改變而改變的。 |
| 2 | 行為型 | Mediator | 中介者 | 用一個中介對象封裝一些列的對象交互。 |
| 2 | 行為型 | Visitor | 訪問者模式 | 表示一個作用于某對象結構中的各元素的操作,它使你可以在不改變各元素類的前提下定義作用于這個元素的新操作。 |
| 1 | 行為型 | Interpreter | 解釋器 | 給定一個語言,定義他的文法的一個表示,并定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。 |
| 1 | 行為型 | Memento | 備忘錄 | 在不破壞對象的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。 |
轉載于:https://www.cnblogs.com/dassmeta/p/8583433.html
總結
以上是生活随笔為你收集整理的设计模式及其应用场景的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 09——规范数据库设计
- 下一篇: 设计模式中的撩妹神技--下篇