第13章軟件模式_第1頁
第13章軟件模式_第2頁
第13章軟件模式_第3頁
第13章軟件模式_第4頁
第13章軟件模式_第5頁
已閱讀5頁,還剩177頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、2/182很多系統(tǒng)的解決方案都比較類似很多系統(tǒng)的解決方案都比較類似解決方案的共同點是什么?區(qū)別在何處?用到哪些特殊的方法?如何制定一個特殊的方法?3/182表示軟件系統(tǒng)的基本結(jié)構(gòu)化組織圖式。提供一個用于細化軟件系統(tǒng)的子系統(tǒng)或組件,或它們之間關(guān)系的圖式。4/182體系結(jié)構(gòu)模式體系結(jié)構(gòu)模式可作為具體軟件體系結(jié)構(gòu)的模版。它們規(guī)定一個應(yīng)用的系統(tǒng)范圍的結(jié)構(gòu)特性,以及對其子系統(tǒng)的體系結(jié)構(gòu)施加的影響。體系結(jié)構(gòu)模式的選擇是開發(fā)一個軟件系統(tǒng)時的基本設(shè)計決策。5/182設(shè)計模式設(shè)計模式軟件體系結(jié)構(gòu)的子系統(tǒng),以及它們之間的關(guān)系。通常 由幾個更小的體系結(jié)構(gòu)單元構(gòu)成。中等規(guī)模的模式。規(guī)模上比體系結(jié)構(gòu)模式小,但又獨立于特

2、定編程語言。設(shè)計模式的應(yīng)用對軟件系統(tǒng)的基礎(chǔ)結(jié)構(gòu)沒有影響,但可能對子系統(tǒng)的體系結(jié)構(gòu)有所影響。提供分解更復(fù)雜的服務(wù)或組件的結(jié)構(gòu),以及它們之間的合作。6/182慣用法慣用法處理特定設(shè)計問題的實現(xiàn)代表最低層模式,關(guān)注設(shè)計和實現(xiàn)方面針對具體語言,捕獲現(xiàn)有的編程經(jīng)驗7/182一個模式關(guān)注一個在特定設(shè)計環(huán)境中出現(xiàn)的設(shè)計一個模式關(guān)注一個在特定設(shè)計環(huán)境中出現(xiàn)的設(shè)計問題,并為它提供一個解決方案。問題,并為它提供一個解決方案。各種模式用文檔記錄下現(xiàn)存的經(jīng)過充分考驗的設(shè)各種模式用文檔記錄下現(xiàn)存的經(jīng)過充分考驗的設(shè)計經(jīng)驗。計經(jīng)驗。模式為設(shè)計原則提供一種公共的詞匯和理解。模式為設(shè)計原則提供一種公共的詞匯和理解。模式是為軟件

3、體系結(jié)構(gòu)建立文檔的一種手段。模式是為軟件體系結(jié)構(gòu)建立文檔的一種手段。模式支持用已定義的屬性來構(gòu)造軟件。模式支持用已定義的屬性來構(gòu)造軟件。8/182語境:問題出現(xiàn)的場景語境:問題出現(xiàn)的場景問題:在那個語境中出現(xiàn)的再現(xiàn)問題問題:在那個語境中出現(xiàn)的再現(xiàn)問題解決方案必須滿足的需求必須考慮的約束解決方案必須具有的特性解決方案:已被證實的問題的解決方案解決方案:已被證實的問題的解決方案特定的結(jié)構(gòu):組件和關(guān)系的結(jié)構(gòu)運行期的行為9/182模式的圖式:模式的圖式:10/182 架構(gòu)模式架構(gòu)模式 設(shè)計模式設(shè)計模式 物理體系結(jié)構(gòu)建模物理體系結(jié)構(gòu)建模11/182 架構(gòu)模式架構(gòu)模式 設(shè)計模式設(shè)計模式 物理體系結(jié)構(gòu)建模物

4、理體系結(jié)構(gòu)建模12/182一個軟件體系結(jié)構(gòu)的模式描述了一個出一個軟件體系結(jié)構(gòu)的模式描述了一個出現(xiàn)在特定設(shè)計語境中的特殊的再現(xiàn)設(shè)計現(xiàn)在特定設(shè)計語境中的特殊的再現(xiàn)設(shè)計問題,并為它的解決方案提供了一個經(jīng)問題,并為它的解決方案提供了一個經(jīng)過充分驗證的通用圖式。過充分驗證的通用圖式。一組預(yù)先確定的子系統(tǒng)和他們的職責子系統(tǒng)間的相互關(guān)聯(lián)的規(guī)則例如: Model-View-Controller模式13/18214/182層體系結(jié)構(gòu)模式有助于構(gòu)建這樣的應(yīng)用:層體系結(jié)構(gòu)模式有助于構(gòu)建這樣的應(yīng)用: 它能被分解成子任務(wù)組,其中每個子任務(wù)組它能被分解成子任務(wù)組,其中每個子任務(wù)組處于一個特定的抽象層次上。處于一個特定的抽

5、象層次上。下層為上層提供服務(wù)上層利用下層提供的服務(wù)完成自身的任務(wù)通過同步程序調(diào)用來完成請求的服務(wù)15/18216/182一個獨立層的描述一個獨立層的描述17/182舉例:虛擬機舉例:虛擬機e.g. JVM舉例:舉例: APIse.g. C standard library, built on Unix system calls舉例:信息系統(tǒng)舉例:信息系統(tǒng)應(yīng)用層數(shù)據(jù)庫表示層應(yīng)用邏輯層領(lǐng)域?qū)訑?shù)據(jù)庫18/182舉例:舉例:Windows NT系統(tǒng)服務(wù):子系統(tǒng)和NT執(zhí)行程序之間的接口層資源管理器層:包含對象管理器、安全引用監(jiān)視器、過程管理器、I/O管理器、虛擬存儲管理器和局部過程調(diào)用等模塊。內(nèi)核:它關(guān)

6、心一些基本功能,如中斷和意外處理、多處理器同步、線程調(diào)度和現(xiàn)程分配。硬件抽象層(HAL):隱藏了不同處理器系列機器之間的硬件差異。硬件19/18220/182優(yōu)點:優(yōu)點:層的重用標準化支持局部性依賴可替換性不足不足更改行為的重疊降低效率不必要的工作難以認可層的正確粒度21/18222/182將一個交互式應(yīng)用程序分為三個組件。將一個交互式應(yīng)用程序分為三個組件。模型模型(Model):核心功能和數(shù)據(jù):核心功能和數(shù)據(jù)視圖視圖(Views):向用戶顯示信息:向用戶顯示信息控制器控制器(Controllers):處理用戶輸入:處理用戶輸入視圖和控制器共同構(gòu)成了用戶接口視圖和控制器共同構(gòu)成了用戶接口變更變

7、更-傳播機制確保了用戶接口和模型之間的一致性傳播機制確保了用戶接口和模型之間的一致性23/18224/18225/182相同的信息在不同的窗口有不同的表示相同的信息在不同的窗口有不同的表示支持不同的支持不同的“樣式和感覺樣式和感覺”標準標準模型獨立于表示模型獨立于表示布告形式連接布告形式連接觀察者設(shè)計模式舉例:舉例:SmalltalkASP.NET .aspx:視圖:視圖 .VB,.C#:控制:控制26/18227/182服務(wù)器端為客戶端提供服務(wù)服務(wù)器端為客戶端提供服務(wù)客戶端從服務(wù)器端請求服務(wù)客戶端從服務(wù)器端請求服務(wù)服務(wù)器一直保持監(jiān)聽請求的狀態(tài)服務(wù)器一直保持監(jiān)聽請求的狀態(tài)舉例:舉例:遠程數(shù)據(jù)庫

8、連接遠程文件系統(tǒng)多層信息系統(tǒng)Web 應(yīng)用28/18229/182支持容錯性、并行計算以及計算準確性。支持容錯性、并行計算以及計算準確性。主控組件將工作分配給相同的從屬組件,并主控組件將工作分配給相同的從屬組件,并從從屬組件返回的結(jié)果中計算最終的結(jié)果。從從屬組件返回的結(jié)果中計算最終的結(jié)果。舉例:舉例:嵌入式系統(tǒng)大規(guī)模并行計算容錯系統(tǒng)30/18231/18232/182主控模塊故障,整個系統(tǒng)故障主控模塊故障,整個系統(tǒng)故障主控模塊將任務(wù)劃分為幾個同等的子任務(wù)主控模塊將任務(wù)劃分為幾個同等的子任務(wù)從屬之間相互獨立從屬之間相互獨立從屬之間并行工作從屬之間并行工作問題是可以分解的問題是可以分解的應(yīng)用領(lǐng)域:應(yīng)

9、用領(lǐng)域:容錯并行計算計算準確性33/182優(yōu)點:優(yōu)點:可互換性和可擴充性事務(wù)分離效率不足:不足:可行性對機器依賴性難以實現(xiàn)可移植性34/18235/182管道和過濾器體系結(jié)構(gòu)模式,為處理數(shù)據(jù)流的系統(tǒng)提供管道和過濾器體系結(jié)構(gòu)模式,為處理數(shù)據(jù)流的系統(tǒng)提供了一種結(jié)構(gòu)了一種結(jié)構(gòu)每個處理步驟封裝在一個過濾器組件中每個處理步驟封裝在一個過濾器組件中數(shù)據(jù)通過相鄰過濾器之間的管道傳輸數(shù)據(jù)通過相鄰過濾器之間的管道傳輸管道處理緩沖和同步重組過濾器可以建立相關(guān)系統(tǒng)族重組過濾器可以建立相關(guān)系統(tǒng)族舉例:舉例:編譯器Unix 內(nèi)核命令36/18237/18238/182優(yōu)點:優(yōu)點:通過過濾器交換增加了靈活性通過重組增加了

10、靈活性過濾器組件的重用并行處理提高效率不足:不足:共享狀態(tài)信息或者昂貴或者不靈活并行處理獲得的效率往往只一種假象數(shù)據(jù)轉(zhuǎn)換額外開銷錯誤處理39/18240/182代理者結(jié)構(gòu)模式可以用于構(gòu)建帶有隔離組件的分布式代理者結(jié)構(gòu)模式可以用于構(gòu)建帶有隔離組件的分布式軟件系統(tǒng),該軟件通過遠程服務(wù)調(diào)用進行交互。軟件系統(tǒng),該軟件通過遠程服務(wù)調(diào)用進行交互。代理者組件負責協(xié)調(diào)通信代理者組件負責協(xié)調(diào)通信轉(zhuǎn)發(fā)請求、傳送結(jié)果和異常服務(wù)器將他們的服務(wù)(屬性和操作)發(fā)布給一個代理服務(wù)器將他們的服務(wù)(屬性和操作)發(fā)布給一個代理客戶端通過一個代理請求服務(wù)器處理客戶端通過一個代理請求服務(wù)器處理代理將請求發(fā)送給一個合適的服務(wù)器處理代理

11、將請求發(fā)送給一個合適的服務(wù)器處理41/182允許動態(tài)改變、添加、刪除和重新發(fā)布允許動態(tài)改變、添加、刪除和重新發(fā)布對于開發(fā)者來說,代理是透明的對于開發(fā)者來說,代理是透明的請求需要有標準的表示法請求需要有標準的表示法當兩個代理者互操作時,實現(xiàn)細節(jié)可通過網(wǎng)橋來隱藏當兩個代理者互操作時,實現(xiàn)細節(jié)可通過網(wǎng)橋來隱藏舉例:舉例:公共對象請求代理體系結(jié)構(gòu)(CORBA),處理異構(gòu)系統(tǒng)上分布式對象的面向?qū)ο蠹夹g(shù)Web services42/18243/18244/182對稱的對稱的 客戶機客戶機-服務(wù)器模式服務(wù)器模式客戶機向服務(wù)器請求服務(wù)服務(wù)器通知客戶機特定的事件任何一個節(jié)點都可以扮演客戶機或者服務(wù)器的角色可以動

12、態(tài)的交換角色舉例:舉例:多用戶應(yīng)用P2P 技術(shù)45/18246/182事件源將消息發(fā)布到總線上的特殊通道上事件源將消息發(fā)布到總線上的特殊通道上事件監(jiān)聽者訂閱通道上的消息事件監(jiān)聽者訂閱通道上的消息監(jiān)聽者監(jiān)聽有效消息監(jiān)聽者監(jiān)聽有效消息消息是異步的消息是異步的通路可以是固定的通路可以是固定的47/18248/182黑板體系結(jié)構(gòu)模式對于無確定性求解策略的問題比較有用。黑板體系結(jié)構(gòu)模式對于無確定性求解策略的問題比較有用。黑板模式中,有幾個專用子系統(tǒng)收集其知識,以建立一個可能的部分解或近似解。舉例: 語音識別所有組件共享數(shù)據(jù)存儲(黑板)所有組件共享數(shù)據(jù)存儲(黑板)組件生成新的數(shù)據(jù)更新到黑板組件生成新的數(shù)據(jù)

13、更新到黑板組件監(jiān)視黑板上的數(shù)據(jù)組件監(jiān)視黑板上的數(shù)據(jù)利用匹配模式尋找特定的數(shù)據(jù)49/18250/18251/182優(yōu)點:優(yōu)點:對可更改性和可維護性的支持可重用的知識源支持容錯性和健壯性不足:不足:測試困難不能保證有好的求解方案難以建立一個好的控制策略低效昂貴的開發(fā)工作缺少對并行機制的支持52/182 架構(gòu)模式架構(gòu)模式 設(shè)計模式設(shè)計模式 物理體系結(jié)構(gòu)建模物理體系結(jié)構(gòu)建模53/182 Abstract factory(抽象工廠) 提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無需制定它們具體的類。而無需制定它們具體的類。 Adapter(適配器) 將一個類

14、的接口轉(zhuǎn)換成客戶希望的另一個接口。它將一個類的接口轉(zhuǎn)換成客戶希望的另一個接口。它使得原本由于接口不兼容而不能在一起工作的那些使得原本由于接口不兼容而不能在一起工作的那些類可以在一起工作。類可以在一起工作。 Bridge (橋接) 將抽象部分與它的實現(xiàn)部分分離,使它們都可以獨將抽象部分與它的實現(xiàn)部分分離,使它們都可以獨立的變化。立的變化。54/182 Builder(生成器) 將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。程可以創(chuàng)建不同的表示。 Chain of Responsibility(職責鏈) 為解除請求的發(fā)

15、送者和接受者之間的耦合,而使多個對象都為解除請求的發(fā)送者和接受者之間的耦合,而使多個對象都有機會處理這個請求。將這些對象連成一條鏈,并沿著這個有機會處理這個請求。將這些對象連成一條鏈,并沿著這個鏈傳遞該請求,直到有一個對象處理它。鏈傳遞該請求,直到有一個對象處理它。 Command (命令) 將一個請求封裝成一個對象,從而使你可用不同的請求對客將一個請求封裝成一個對象,從而使你可用不同的請求對客戶進行參數(shù)化;對請求排隊或記錄請求日志,以及支持可取戶進行參數(shù)化;對請求排隊或記錄請求日志,以及支持可取消的操作。消的操作。55/182 Composite(組成) 將對象組合成樹型結(jié)構(gòu)以表示將對象組合

16、成樹型結(jié)構(gòu)以表示“部分部分-整體整體”的層次結(jié)構(gòu)。它使的層次結(jié)構(gòu)。它使得客戶對單個對象和復(fù)合對象的使用具有一致性。得客戶對單個對象和復(fù)合對象的使用具有一致性。 Decorator(裝飾) 動態(tài)的給一個對象添加一些額外的職責。就擴展功能而言,該動態(tài)的給一個對象添加一些額外的職責。就擴展功能而言,該模式比生成子類的方式更為靈活。模式比生成子類的方式更為靈活。 Facade (外觀) 為子系統(tǒng)中的一組接口提供一個已知的界面,該模式定義了一為子系統(tǒng)中的一組接口提供一個已知的界面,該模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。56/182

17、Factory Method(工廠方法) 定義一個用于創(chuàng)建對象的接口,讓子類決定將哪一個類定義一個用于創(chuàng)建對象的接口,讓子類決定將哪一個類實例化。它使得一個類的實例化延遲到其子類。實例化。它使得一個類的實例化延遲到其子類。 Flyweight(享元) 運用共享技術(shù)有效地支持大量細粒度的對象。運用共享技術(shù)有效地支持大量細粒度的對象。 Interpreter (解釋器) 給定一個語言,定義它的文法的一種表示,并定義一個給定一個語言,定義它的文法的一種表示,并定義一個解釋器,該解釋器使用該表示來解釋語言中的句子。解釋器,該解釋器使用該表示來解釋語言中的句子。57/182 Iterator(迭代器)

18、提供一種方法順序訪問一個聚合對象中的各個元素,而又不需提供一種方法順序訪問一個聚合對象中的各個元素,而又不需暴露該對象的內(nèi)部表示。暴露該對象的內(nèi)部表示。 Mediator(中介者) 用一個中介對象來封裝一些列的對象交互。中介者使各對象不用一個中介對象來封裝一些列的對象交互。中介者使各對象不需要顯示地相互引用,從而使其耦合松散,而且可以獨立地改需要顯示地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。變它們之間的交互。 Memento (備忘錄) 在不破壞封裝性的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該在不破壞封裝性的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣以

19、后就可將該對象恢復(fù)到保存的對象之外保存這個狀態(tài)。這樣以后就可將該對象恢復(fù)到保存的狀態(tài)。狀態(tài)。58/182 Observer(觀察者) 定義對象間的一種一對多的依賴關(guān)系,以便當一個對象定義對象間的一種一對多的依賴關(guān)系,以便當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并自動刷新。自動刷新。 Prototype(原型) 用原型實例制定創(chuàng)建對象的種類,并通過拷貝這個原型用原型實例制定創(chuàng)建對象的種類,并通過拷貝這個原型來創(chuàng)建新的對象。來創(chuàng)建新的對象。 Proxy (代理) 為其他對象提供一個代理以控制對這個對象的訪問。為其他對象提供一個代理以控

20、制對這個對象的訪問。59/182 Singleton(單件) 保證一個類僅有一個實例,并提供一個訪問它的全局訪保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。問點。 State(狀態(tài)) 允許一個對象在其內(nèi)部狀態(tài)改變時改變它的行為。對象允許一個對象在其內(nèi)部狀態(tài)改變時改變它的行為。對象看起來似乎修改了他所屬的類??雌饋硭坪跣薷牧怂鶎俚念悺?Strategy (策略) 定義一系列算法,把它們一個個封裝起來,并且使它們定義一系列算法,把它們一個個封裝起來,并且使它們可相互替換。本模式使得算法的變化可獨立于使用它的可相互替換。本模式使得算法的變化可獨立于使用它的客戶。客戶。60/182 Temp

21、late Method(模版方法) 定義一個操作中的算法的骨架,而將一些步驟延遲到子定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。該模式使得子類可以不改變一個算法的結(jié)構(gòu)即可類中。該模式使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。重定義該算法的某些特定步驟。 Visitor(訪問者) 表示一個作用于某對象結(jié)構(gòu)中的各元素的操作。它使你表示一個作用于某對象結(jié)構(gòu)中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素可以在不改變各元素的類的前提下定義作用于這些元素的新操作。的新操作。61/182目的目的創(chuàng)建型創(chuàng)建型結(jié)構(gòu)型結(jié)構(gòu)型行為型行為型范范圍圍類類 Fac

22、tory MethodAdapter(類類)InterpreterTemplate Method對對象象Abstract FactoryBuilderPrototypeSingletonAdapter(對象對象)BridgeCompositeDecoratorFaadeFlyweightProxyChain of ResponsibilityCommandIteratorMediatorMementoObserverStateStrategyVisitor62/182 優(yōu)點 面向接口編程面向接口編程 創(chuàng)建型模式確保系統(tǒng)是采用針對接口的方式書寫的,而不是針對實現(xiàn)而書寫的。 降低耦合性降低耦合性

23、增加靈活性增加靈活性63/182 創(chuàng)建型模式 將系統(tǒng)使用哪些具體的類的信息封裝起來將系統(tǒng)使用哪些具體的類的信息封裝起來 隱藏了這些類的實例是如何被創(chuàng)建和放在一隱藏了這些類的實例是如何被創(chuàng)建和放在一起的起的64/182 客戶類和工廠類分開??蛻羧魏螘r候需要某種產(chǎn)品,只需向工廠請求即可。客戶無須修改就可以接納新產(chǎn)品。 缺點是當產(chǎn)品修改時,工廠類也要做相應(yīng)的修改。65/18266/18267/18268/18269/18270/182 意圖 定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。 Factory Method 使一個類的實例化延遲

24、到其子類。使一個類的實例化延遲到其子類。 適用性:適用性: 當一個類不知道它所必須創(chuàng)建的對象的類的時候; 當一個類希望由它的子類來指定它所創(chuàng)建的對象的時候 當類將創(chuàng)建對象的職責委托給多個幫助子類的某一個,并且你希望將哪一個幫助子類是代理者這一信息局部化的時候71/182 結(jié)構(gòu)參與者 Product定義工廠方法所創(chuàng)建的對象的接口 ConcreteProduct實現(xiàn)Product接口 Creator聲明工廠方法,該方法返回一個聲明工廠方法,該方法返回一個Product類型的對象。類型的對象??梢哉{(diào)用工廠方法以創(chuàng)建一個可以調(diào)用工廠方法以創(chuàng)建一個Product對象。對象。 ConcreteCreato

25、r重定義工廠方法以返回一個ConcreteProduct實例72/182 協(xié)作 Creator依賴于它的子類來定義工廠方法,所以它返回一個適當?shù)腃oncreteProduct實例73/182public abstract class CarFactory public abstract Car creator();public class VM1Factory extends Factorypublic Car creator().return new Carpublic class VM2Factory extends Factorypublic Car creator().return n

26、ew Car 74/182 意圖 提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無需指定它們具體的類。而無需指定它們具體的類。 75/182 參與者 AbstractFactory聲明一個創(chuàng)建抽象產(chǎn)品對象的操作接口聲明一個創(chuàng)建抽象產(chǎn)品對象的操作接口 ConcreteFactory實現(xiàn)創(chuàng)建具體產(chǎn)品對象的操作實現(xiàn)創(chuàng)建具體產(chǎn)品對象的操作 AbstractProduct為一類產(chǎn)品對象聲明一個接口為一類產(chǎn)品對象聲明一個接口 ConcreteProduct 定義一個將被相應(yīng)的具體工廠創(chuàng)建的產(chǎn)品對象 實現(xiàn)AbstractProduct接口 Client 僅使用由僅

27、使用由AbstractFactory和和AbstractProduct類聲明的接口類聲明的接口 協(xié)作 通常在運行時刻創(chuàng)建一個通常在運行時刻創(chuàng)建一個ConcreteFactory類的實例。這一具體類的實例。這一具體的工廠創(chuàng)建具有特定實現(xiàn)的產(chǎn)品對象。為創(chuàng)建不同的產(chǎn)品對象,的工廠創(chuàng)建具有特定實現(xiàn)的產(chǎn)品對象。為創(chuàng)建不同的產(chǎn)品對象,客戶應(yīng)適用不同的具體工廠??蛻魬?yīng)適用不同的具體工廠。 AbstractFactory將產(chǎn)品對象的創(chuàng)建延遲到它的將產(chǎn)品對象的創(chuàng)建延遲到它的ConcreteFactory子類。子類。76/182public abstract class CarFactory public abs

28、tract Car creator();public abstract Truck creator(String s); public class VM1Factory extends Factorypublic Car creator().return new Jettapublic Truck creator(String s).return new BigBigpublic class VM2 extends Factorypublic Car creator().return new Polo public Truck creator(String s).return new LLL7

29、7/182 與與Factory Method模式的比較模式的比較 Factory Method模式 利用給利用給Factory對象傳遞不同的參數(shù),以返回對象傳遞不同的參數(shù),以返回具有相同基類或?qū)崿F(xiàn)了同一接口的對象具有相同基類或?qū)崿F(xiàn)了同一接口的對象 Abstract Factory模式 先利用先利用Factory模式返回模式返回Factory對象,再通對象,再通過過Factory對象返回不同的對象對象返回不同的對象78/182 將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。 建造模式可以強制實行一種分步驟進行的建造過程。 79/182 參與者: Builder為創(chuàng)建一

30、個為創(chuàng)建一個Product對象的各個部件制對象的各個部件制定抽象接口。定抽象接口。 ConcreteBuilder 實現(xiàn)Builder的接口以構(gòu)造和裝配該產(chǎn)品的各個部件 定義并明確它所創(chuàng)建的表示 提供一個檢索產(chǎn)品的接口 Derector構(gòu)造一個使用構(gòu)造一個使用Builder接口的對象接口的對象 Product 表示被構(gòu)造的復(fù)雜對象 包含定義組成部件的類80/182 協(xié)作: 客戶創(chuàng)建客戶創(chuàng)建Director對象,并用它所想要的對象,并用它所想要的Builder對對象進行配置象進行配置 一旦產(chǎn)品部件被生成,導(dǎo)向器就會通知生成器一旦產(chǎn)品部件被生成,導(dǎo)向器就會通知生成器 生成器處理導(dǎo)向器的請求,并將部

31、件添加到該產(chǎn)品生成器處理導(dǎo)向器的請求,并將部件添加到該產(chǎn)品中中 客戶從生成器中檢索產(chǎn)品客戶從生成器中檢索產(chǎn)品81/182public interface Builder /創(chuàng)建部件A:比如汽車車輪void buildPartA(); /創(chuàng)建部件B:比如方向盤void buildPartB(); /創(chuàng)建部件C:比如發(fā)動機void buildPartC(); /返回最終組裝產(chǎn)品成果 (返回最后裝配好的汽車)/成品的組裝過程不在這里進行,而是轉(zhuǎn)移到下面的Director中進行。/從而實現(xiàn)過程與部件的解耦。Product getResult(); public class Director priva

32、te Builder builder; public Director( Builder builder ) this.builder = builder; / 將partA, partB, partC最后組成復(fù)雜物件/汽車的組裝過程public void construct() builder.buildPartA();builder.buildPartB();builder.buildPartC(); 82/182意圖用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象。用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象。 其實是將product和factory功能合

33、二為一了。缺點是每一個類都必須配備一個克隆方法。適用性:當一個系統(tǒng)應(yīng)該獨立于它的產(chǎn)品創(chuàng)建、構(gòu)成和表示時,要使用當一個系統(tǒng)應(yīng)該獨立于它的產(chǎn)品創(chuàng)建、構(gòu)成和表示時,要使用Prototype模式;以及模式;以及當要實例化的類是在運行時刻指定時;或者當要實例化的類是在運行時刻指定時;或者為了避免創(chuàng)建一個與產(chǎn)品類層次平行的工廠類層次時;或者為了避免創(chuàng)建一個與產(chǎn)品類層次平行的工廠類層次時;或者當一個類的實例只能由幾個不同狀態(tài)組合中的一種時。建立相應(yīng)數(shù)目的當一個類的實例只能由幾個不同狀態(tài)組合中的一種時。建立相應(yīng)數(shù)目的原型并克隆它們可能比每次用合適的狀態(tài)手工實例化該類更方便一些。原型并克隆它們可能比每次用合適的

34、狀態(tài)手工實例化該類更方便一些。83/182參與者 Prototype聲明一個克隆自身的接口。聲明一個克隆自身的接口。 ConcretePrototype實現(xiàn)一個克隆自身的操作。實現(xiàn)一個克隆自身的操作。 Client讓一個原型克隆自身從而創(chuàng)建一個新的對象。讓一個原型克隆自身從而創(chuàng)建一個新的對象。協(xié)作 客戶請求一個原型克隆自身客戶請求一個原型克隆自身84/182public abstract class AbstractSpoon implements Cloneable String spoonName; public void setSpoonName(String spoonName) th

35、is.spoonName = spoonName;public String getSpoonName() return this.spoonName;public Object clone() Object object = null;try object = super.clone(); catch (CloneNotSupportedException exception) System.err.println(AbstractSpoon is not Cloneable);return object;public class SoupSpoon extends AbstractSpoo

36、n public SoupSpoon()setSpoonName(Soup Spoon); public class SaladSpoon extends AbstractSpoon public SaladSpoon()setSpoonName(Salad Spoon); 85/182意圖 保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。 類自身負責保存它的唯一實例。解決的主要是性能問題,而非耦合(變化)的問題。適用性 當類只能由一個實例而且客戶可以從一個眾所周知的訪問點訪問當類只能由一個實例而且客戶可以從一個眾所周知的訪問點訪問它

37、時它時 當這個唯一實例應(yīng)該是通過子類化可擴展的,并且客戶應(yīng)該無需當這個唯一實例應(yīng)該是通過子類化可擴展的,并且客戶應(yīng)該無需更改代碼就能使用一個擴展的實例時。更改代碼就能使用一個擴展的實例時。86/182參與者 Singleton定義一個Instance操作,允許客戶訪問它的唯一實例。可能負責創(chuàng)建它自己的唯一實例。協(xié)作 客戶只能通過客戶只能通過Singleton的的Instance操作訪問一個操作訪問一個Singleton實例。實例。87/182public class Singleton private static Singleton instance = null;public static

38、 synchronized Singleton getInstance() /這個方法比上面有所改進,不用每次都進行生成對象, /只是第一次使用時生成實例,提高了效率!if (instance=null)instancenew Singleton();return instance; 88/182 創(chuàng)建型模式規(guī)定了創(chuàng)建對象的方式。在必須決定實例化創(chuàng)建型模式規(guī)定了創(chuàng)建對象的方式。在必須決定實例化某個類時,使用這些模式。某個類時,使用這些模式。 通常,由抽象超類封裝實例化類的細節(jié),這些細節(jié)包括通常,由抽象超類封裝實例化類的細節(jié),這些細節(jié)包括這些類確切是什么,以及如何及何時創(chuàng)建這些類。這些類確切是什

39、么,以及如何及何時創(chuàng)建這些類。 對客戶類來講,這些類的細節(jié)是隱藏的。客戶類只知道對客戶類來講,這些類的細節(jié)是隱藏的??蛻纛愔恢莱橄箢惢虺橄箢悓崿F(xiàn)的接口??蛻纛愅ǔ2⒉恢谰唧w抽象類或抽象類實現(xiàn)的接口??蛻纛愅ǔ2⒉恢谰唧w類的確切類型。類的確切類型。 當系統(tǒng)演化依賴于對象的組合、聚集時,創(chuàng)建型模式帶當系統(tǒng)演化依賴于對象的組合、聚集時,創(chuàng)建型模式帶來了更大的靈活性。來了更大的靈活性。89/182 結(jié)構(gòu)型模式 如何組合類和對象以獲得更大的結(jié)構(gòu)如何組合類和對象以獲得更大的結(jié)構(gòu) 類模型采用繼承機制來組合接口或?qū)崿F(xiàn),如采用多重繼承方法將兩個以上的類組合成一個類 對象模式不是對接口和實現(xiàn)進行組合,它描述

40、了如何對一些對象進行組合,從而實現(xiàn)新功能的一些方法。在運行時刻改變對象組合關(guān)系,具有更大的靈活性。90/182 把一個類的接口變換成客戶端所期待的另一種把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口原因不匹配而無法一接口,從而使原本因接口原因不匹配而無法一起工作的兩個類能夠一起工作。起工作的兩個類能夠一起工作。 適配類可以根據(jù)參數(shù)返還一個合適的實例給客適配類可以根據(jù)參數(shù)返還一個合適的實例給客戶端。戶端。91/18292/18293/182 參與者 Target定義定義Client使用的與特定另一相關(guān)的接口使用的與特定另一相關(guān)的接口 Client與符合與符合Target接口的對象

41、協(xié)同接口的對象協(xié)同 Adaptee定義一個已經(jīng)存在的接口,這個接口需要適配定義一個已經(jīng)存在的接口,這個接口需要適配 Adapter對對Adaptee的接口與的接口與Target接口進行適配接口進行適配 協(xié)作 Client在在Adapter實例上調(diào)用一些操作。接著適配器調(diào)用實例上調(diào)用一些操作。接著適配器調(diào)用Adaptee的操作實現(xiàn)這個請求。的操作實現(xiàn)這個請求。94/182public interface IRoundPegpublic void insertIntoHole(String msg);public interface ISquarePegpublic void insert(Str

42、ing str);public class PegAdapter implements IRoundPeg, ISquarePegprivate RoundPeg roundPeg;private SquarePeg squarePeg;/ 構(gòu)造方法 public PegAdapter(RoundPeg peg)this.roundPeg=peg; / 構(gòu)造方法 public PegAdapter(SquarePeg peg)this.squarePeg=peg; public void insert(String str) roundPeg.insertIntoHole(str); publ

43、ic void insertIntoHole(String str)SquarePeg.insert(str);95/18296/182 將抽象部分與它的實現(xiàn)部分分離,使它們都可以獨立地變化。 解決2個方面的變化問題:抽象與實現(xiàn)。即一個類中多個方向的變化問題。 97/182 參與者參與者 Abstraction 定義抽象類的接口定義抽象類的接口 維護一個指向維護一個指向Implementor類型對象的指針類型對象的指針 RefinedAbstraction擴充由Abstraction定義的接口 Implementor定義實現(xiàn)類的接口,該接口不一定要與Abstraction的接口完全一致。 Co

44、ncreteImplementor實現(xiàn)Implementor接口并定義它的具體實現(xiàn) 協(xié)作協(xié)作 Abstraction將Client的請求轉(zhuǎn)發(fā)給它的Implementor對象98/182public abstract class CoffeeCoffeeImp coffeeImp;public void setCoffeeImp() this.CoffeeImp = CoffeeImpSingleton.getTheCoffeImp();public SodaImp getCoffeeImp() return this.CoffeeImp;public abstract void pourCof

45、fee();public abstract class CoffeeImppublic abstract void pourCoffeeImp();/bridgepublic class CoffeeImpSingleton private static CoffeeImp coffeeImp; public CoffeeImpSingleton(CoffeeImp coffeeImpIn) this.coffeeImp = coffeeImpIn;public static CoffeeImp getTheCoffeeImp()return coffeeImp;99/182100/18210

46、1/182 合成模式把部分與整體關(guān)系用樹結(jié)構(gòu)表示。 合成模式使得用戶對單個對象和組合對象的使用具有一致性。102/182103/182 參與者 Component 為組合中的對象聲明接口 在適當?shù)那闆r下,實現(xiàn)所有類共有接口的缺省行為 聲明一個接口用于訪問和管理Component的子組件 (可選)在遞歸結(jié)構(gòu)中定義一個接口,用于訪問一個父部件,并在合適的情況下實現(xiàn)它 Leaf 在組合中表示葉節(jié)點對象,葉節(jié)點沒有子節(jié)點 在組合中定義圖元對象的行為 Composite 定義有子部件的那些部件的行為 存儲子部件 在Component接口中實現(xiàn)與子部件有關(guān)的操作 Client 通過Component接口操

47、縱組合部件的對象104/182 協(xié)作 用戶使用用戶使用Component類接口與組合結(jié)構(gòu)中的對類接口與組合結(jié)構(gòu)中的對象進行交互。如果接收者是一個葉節(jié)點,則直象進行交互。如果接收者是一個葉節(jié)點,則直接處理請求。如果接收者是接處理請求。如果接收者是Composite,它通,它通常將請求發(fā)送給它的子部件,在轉(zhuǎn)發(fā)請求之前常將請求發(fā)送給它的子部件,在轉(zhuǎn)發(fā)請求之前與與/或之后,可能執(zhí)行一些輔助操作。或之后,可能執(zhí)行一些輔助操作。105/182public abstract class Equipmentprivate String name; /網(wǎng)絡(luò)價格 public abstract double ne

48、tPrice();/打折價格public abstract double discountPrice();/增加部件public boolean add(Equipment equipment) return false; /刪除部件public boolean remove(Equipment equipment) return false; /注意這里,提供一種用于訪問組合部件的方法。public Iterator iter() return null; public Equipment(final String name) =name; public class Dis

49、k extends Equipmentabstract class CompositeEquipment extends Equipment 106/182意圖 動態(tài)地給一個對象添加一些額外的職責。就增加功能來說,動態(tài)地給一個對象添加一些額外的職責。就增加功能來說,Decorator模式相比生成子類更為靈活。模式相比生成子類更為靈活。一個類可能有些額外的責任(除了主體業(yè)務(wù)操作),如加密、緩存、壓縮等,這些可能只是輔助主體業(yè)務(wù)的附著,并不嚴格按照維度變化。裝飾模式以對客戶端透明的方式擴展對象的功能,是繼承關(guān)系的一個替代方案,提供比繼承更多的靈活性。動態(tài)給一個對象增加功能,這些功能可以再動態(tài)的撤消

50、。增加由一些基本功能的排列組合而產(chǎn)生的非常大量的功能。既繼承又組合,實際上是將Bridge中的抽象和實現(xiàn)合二為一了,是其特殊形式。 107/182參與者Component定義一個對象接口,可以給這些對象動態(tài)地添加職責。定義一個對象接口,可以給這些對象動態(tài)地添加職責。ConcreteComponent定義一個對象,可以給這個對象添加一些職責。定義一個對象,可以給這個對象添加一些職責。Decorator維持一個指向維持一個指向Component對象的指針,并定義一個與對象的指針,并定義一個與 Component接口一致的接口接口一致的接口ConcreteDecorator向組件添加職責。向組件添加

51、職責。協(xié)作Decorator將請求轉(zhuǎn)發(fā)給它的將請求轉(zhuǎn)發(fā)給它的Component對象,并有可能在轉(zhuǎn)發(fā)請求前對象,并有可能在轉(zhuǎn)發(fā)請求前后執(zhí)行一些附加的動作后執(zhí)行一些附加的動作108/182public interface Work public void insert(); public class SquarePeg implements Workpublic void insert()System.out.println(“方形杵插入); public class Decorator implements Work private Work work;/額外增加的功能打包在List中 priv

52、ate ArrayList others = new ArrayList(); /在構(gòu)造器中使用組合new方式,引入Work;public Decorator(Work work)this.work=work; others.add(“挖坑); others.add(“釘木板); public void insert() newMethod(); /新方法中在insert之前增加其他方法, 這里次序先后是用戶靈活指定的 public void newMethod()otherMethod();work.insert(); public void otherMethod()ListIterato

53、r listIterator = others.listIterator();while (listIterator.hasNext()System.out.println(String)(listIterator.next() + “ 正在進行); 109/182外部與一個子系統(tǒng)的通信必須通過一個統(tǒng)一的門面對象進行。門面模式提供一個高層次的接口,使得子系統(tǒng)更易于使用。每一個子系統(tǒng)只有一個門面類,而且此門面類只有一個實例,也就是說它是一個單例模式。但整個系統(tǒng)可以有多個門面類。 110/182 參與者參與者Facade 知道哪些子系統(tǒng)類負責處理請求知道哪些子系統(tǒng)類負責處理請求 將客戶的請求代理給

54、適當?shù)淖酉到y(tǒng)對象將客戶的請求代理給適當?shù)淖酉到y(tǒng)對象Subsystem 實現(xiàn)子系統(tǒng)的功能實現(xiàn)子系統(tǒng)的功能 處理由處理由FacadeFacade對象指派的任務(wù)對象指派的任務(wù) 沒有沒有FacadeFacade的任何相關(guān)信息;即沒有指向的任何相關(guān)信息;即沒有指向FacadeFacade的指針的指針 協(xié)作協(xié)作客戶程序通過發(fā)送給Facade的方式與子系統(tǒng)通訊, Facade將這些消息轉(zhuǎn)發(fā)給適當?shù)淖酉到y(tǒng)對象。盡管是子系統(tǒng)中有關(guān)對象在做實際工作,但Facade模式本身也必須將它的接口轉(zhuǎn)換成子系統(tǒng)的接口。使用Facade的客戶程序不需要直接訪問子系統(tǒng)對象。111/182public class DBCompar

55、e String sql = “SELECT * FROM WHERE = ?”;try Mysql msql=new mysql(sql); prep.setString( 1, “” ); rset = prep.executeQuery(); if( rset.next() ) System.out.println( rset.getString( “” ) ); catch( SException e ) e.printStackTrace(); finally mysql.close(); mysql=null;112/182 享元模式以共享的方式高效的支持大量的細粒度對象。 采用類

56、似于Hash表的方式,共享的思想。 客戶端不可以直接創(chuàng)建被共享的對象,而應(yīng)當使用一個工廠對象負責創(chuàng)建被共享的對象。 享元模式大幅度的降低內(nèi)存中對象的數(shù)量,主要解決OO性能問題。113/182114/182參與者Flyweight 描述一個接口,通過這個接口Flyweight可以接受并作用于外部狀態(tài)。ConcreteFlyweight 實現(xiàn)Flyweight接口,并為內(nèi)部狀態(tài)(如果有的話)增加存儲空間。UnsharedConcreteFlyweight 并非所有的Flyweight子類都需要被共享。 Flyweight接口使共享成為可能,但它并不強制共享。在Flyweight對象結(jié)構(gòu)的某些層次,

57、 UnsharedConcreteFlyweight對象通常將ConcreteFlyweight對象作為子節(jié)點。FlyweightFactory 創(chuàng)建并管理Flyweight對象 確保合理地共享Flyweight。Client 維持一個對Flyweight的引用 計算或存儲一個(多個) Flyweight的外部狀態(tài)115/182 協(xié)作 Flywelght執(zhí)行時所需的狀態(tài)必定是內(nèi)部的或外部的。執(zhí)行時所需的狀態(tài)必定是內(nèi)部的或外部的。內(nèi)部狀態(tài)存儲于內(nèi)部狀態(tài)存儲于ConcreteFlyweight對象之中;而外對象之中;而外部對象則由部對象則由Client對象存儲或計算。當用戶調(diào)用對象存儲或計算。當用

58、戶調(diào)用Flywelght對象的操作時,將該狀態(tài)傳遞給它。對象的操作時,將該狀態(tài)傳遞給它。 用戶不應(yīng)直接對用戶不應(yīng)直接對ConcreteFlyweight類進行實例話,類進行實例話,而只能從而只能從FlywelghtFactory對象得到對象得到ConcreteFlyweight對象,這可以保證對它們適當?shù)貙ο?,這可以保證對它們適當?shù)剡M行共享。進行共享。116/182public class CD private String title;private int year;private Artist artist;public String getTitle() return title; p

59、ublic int getYear() return year; public Artist getArtist() return artist; public void setTitle(String t) title = t; public void setYear(int y) year = y; public void setArtist(Artist a) artist = a; public class Artist /內(nèi)部狀態(tài)private String name; / note that Artist is immutable.String getName() return n

60、ame; Artist(String n) name = n; public class ArtistFactory Hashtable pool = new Hashtable();Artist getArtist(String key)Artist result;result = (Artist)pool.get(key);/產(chǎn)生新的Artistif(result = null) result = new Artist(key);pool.put(key,result); return result;117/182 代理模式給某一個對象提供一個代理對象,并由代理對象控制對源對象的引用。 代

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論