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

下載本文檔

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

文檔簡介

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

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

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

4、理體系結(jié)構(gòu)建模12/182一個(gè)軟件體系結(jié)構(gòu)的模式描述了一個(gè)出一個(gè)軟件體系結(jié)構(gòu)的模式描述了一個(gè)出現(xiàn)在特定設(shè)計(jì)語境中的特殊的再現(xiàn)設(shè)計(jì)現(xiàn)在特定設(shè)計(jì)語境中的特殊的再現(xiàn)設(shè)計(jì)問題,并為它的解決方案提供了一個(gè)經(jīng)問題,并為它的解決方案提供了一個(gè)經(jīng)過充分驗(yàn)證的通用圖式。過充分驗(yàn)證的通用圖式。一組預(yù)先確定的子系統(tǒng)和他們的職責(zé)子系統(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ù)組,其中每個(gè)子任務(wù)組它能被分解成子任務(wù)組,其中每個(gè)子任務(wù)組處于一個(gè)特定的抽象層次上。處于一個(gè)特定的抽

5、象層次上。下層為上層提供服務(wù)上層利用下層提供的服務(wù)完成自身的任務(wù)通過同步程序調(diào)用來完成請求的服務(wù)15/18216/182一個(gè)獨(dú)立層的描述一個(gè)獨(dú)立層的描述17/182舉例:虛擬機(jī)舉例:虛擬機(jī)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í)行程序之間的接口層資源管理器層:包含對(duì)象管理器、安全引用監(jiān)視器、過程管理器、I/O管理器、虛擬存儲(chǔ)管理器和局部過程調(diào)用等模塊。內(nèi)核:它關(guān)

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

7、更-傳播機(jī)制確保了用戶接口和模型之間的一致性傳播機(jī)制確保了用戶接口和模型之間的一致性23/18224/18225/182相同的信息在不同的窗口有不同的表示相同的信息在不同的窗口有不同的表示支持不同的支持不同的“樣式和感覺樣式和感覺”標(biāo)準(zhǔn)標(biāo)準(zhǔn)模型獨(dú)立于表示模型獨(dú)立于表示布告形式連接布告形式連接觀察者設(shè)計(jì)模式舉例:舉例: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)舉例:舉例:遠(yuǎn)程數(shù)據(jù)庫

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

9、用領(lǐng)域:容錯(cuò)并行計(jì)算計(jì)算準(zhǔn)確性33/182優(yōu)點(diǎn):優(yōu)點(diǎn):可互換性和可擴(kuò)充性事務(wù)分離效率不足:不足:可行性對(duì)機(jī)器依賴性難以實(shí)現(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)每個(gè)處理步驟封裝在一個(gè)過濾器組件中每個(gè)處理步驟封裝在一個(gè)過濾器組件中數(shù)據(jù)通過相鄰過濾器之間的管道傳輸數(shù)據(jù)通過相鄰過濾器之間的管道傳輸管道處理緩沖和同步重組過濾器可以建立相關(guān)系統(tǒng)族重組過濾器可以建立相關(guān)系統(tǒng)族舉例:舉例:編譯器Unix 內(nèi)核命令36/18237/18238/182優(yōu)點(diǎn):優(yōu)點(diǎn):通過過濾器交換增加了靈活性通過重組增加了

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

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

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)模式對(duì)于無確定性求解策略的問題比較有用。黑板體系結(jié)構(gòu)模式對(duì)于無確定性求解策略的問題比較有用。黑板模式中,有幾個(gè)專用子系統(tǒng)收集其知識(shí),以建立一個(gè)可能的部分解或近似解。舉例: 語音識(shí)別所有組件共享數(shù)據(jù)存儲(chǔ)(黑板)所有組件共享數(shù)據(jù)存儲(chǔ)(黑板)組件生成新的數(shù)據(jù)更新到黑板組件生成新的數(shù)據(jù)

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

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

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

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

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

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

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

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

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

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

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

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

25、r重定義工廠方法以返回一個(gè)ConcreteProduct實(shí)例72/182 協(xié)作 Creator依賴于它的子類來定義工廠方法,所以它返回一個(gè)適當(dāng)?shù)腃oncreteProduct實(shí)例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 意圖 提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無需指定它們具體的類。而無需指定它們具體的類。 75/182 參與者 AbstractFactory聲明一個(gè)創(chuàng)建抽象產(chǎn)品對(duì)象的操作接口聲明一個(gè)創(chuàng)建抽象產(chǎn)品對(duì)象的操作接口 ConcreteFactory實(shí)現(xiàn)創(chuàng)建具體產(chǎn)品對(duì)象的操作實(shí)現(xiàn)創(chuàng)建具體產(chǎn)品對(duì)象的操作 AbstractProduct為一類產(chǎn)品對(duì)象聲明一個(gè)接口為一類產(chǎn)品對(duì)象聲明一個(gè)接口 ConcreteProduct 定義一個(gè)將被相應(yīng)的具體工廠創(chuàng)建的產(chǎn)品對(duì)象 實(shí)現(xiàn)AbstractProduct接口 Client 僅使用由僅

27、使用由AbstractFactory和和AbstractProduct類聲明的接口類聲明的接口 協(xié)作 通常在運(yùn)行時(shí)刻創(chuàng)建一個(gè)通常在運(yùn)行時(shí)刻創(chuàng)建一個(gè)ConcreteFactory類的實(shí)例。這一具體類的實(shí)例。這一具體的工廠創(chuàng)建具有特定實(shí)現(xiàn)的產(chǎn)品對(duì)象。為創(chuàng)建不同的產(chǎn)品對(duì)象,的工廠創(chuàng)建具有特定實(shí)現(xiàn)的產(chǎn)品對(duì)象。為創(chuàng)建不同的產(chǎn)品對(duì)象,客戶應(yīng)適用不同的具體工廠。客戶應(yīng)適用不同的具體工廠。 AbstractFactory將產(chǎn)品對(duì)象的創(chuàng)建延遲到它的將產(chǎn)品對(duì)象的創(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對(duì)象傳遞不同的參數(shù),以返回對(duì)象傳遞不同的參數(shù),以返回具有相同基類或?qū)崿F(xiàn)了同一接口的對(duì)象具有相同基類或?qū)崿F(xiàn)了同一接口的對(duì)象 Abstract Factory模式 先利用先利用Factory模式返回模式返回Factory對(duì)象,再通對(duì)象,再通過過Factory對(duì)象返回不同的對(duì)象對(duì)象返回不同的對(duì)象78/182 將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。 建造模式可以強(qiáng)制實(shí)行一種分步驟進(jìn)行的建造過程。 79/182 參與者: Builder為創(chuàng)建一

30、個(gè)為創(chuàng)建一個(gè)Product對(duì)象的各個(gè)部件制對(duì)象的各個(gè)部件制定抽象接口。定抽象接口。 ConcreteBuilder 實(shí)現(xiàn)Builder的接口以構(gòu)造和裝配該產(chǎn)品的各個(gè)部件 定義并明確它所創(chuàng)建的表示 提供一個(gè)檢索產(chǎn)品的接口 Derector構(gòu)造一個(gè)使用構(gòu)造一個(gè)使用Builder接口的對(duì)象接口的對(duì)象 Product 表示被構(gòu)造的復(fù)雜對(duì)象 包含定義組成部件的類80/182 協(xié)作: 客戶創(chuàng)建客戶創(chuàng)建Director對(duì)象,并用它所想要的對(duì)象,并用它所想要的Builder對(duì)對(duì)象進(jìn)行配置象進(jìn)行配置 一旦產(chǎn)品部件被生成,導(dǎo)向器就會(huì)通知生成器一旦產(chǎn)品部件被生成,導(dǎo)向器就會(huì)通知生成器 生成器處理導(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ā)動(dòng)機(jī)void buildPartC(); /返回最終組裝產(chǎn)品成果 (返回最后裝配好的汽車)/成品的組裝過程不在這里進(jìn)行,而是轉(zhuǎn)移到下面的Director中進(jìn)行。/從而實(shí)現(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意圖用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過拷貝這些原型創(chuàng)建新的對(duì)象。用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過拷貝這些原型創(chuàng)建新的對(duì)象。 其實(shí)是將product和factory功能合

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

34、狀態(tài)手工實(shí)例化該類更方便一些。83/182參與者 Prototype聲明一個(gè)克隆自身的接口。聲明一個(gè)克隆自身的接口。 ConcretePrototype實(shí)現(xiàn)一個(gè)克隆自身的操作。實(shí)現(xiàn)一個(gè)克隆自身的操作。 Client讓一個(gè)原型克隆自身從而創(chuàng)建一個(gè)新的對(duì)象。讓一個(gè)原型克隆自身從而創(chuàng)建一個(gè)新的對(duì)象。協(xié)作 客戶請求一個(gè)原型克隆自身客戶請求一個(gè)原型克隆自身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意圖 保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)。保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)。 類自身負(fù)責(zé)保存它的唯一實(shí)例。解決的主要是性能問題,而非耦合(變化)的問題。適用性 當(dāng)類只能由一個(gè)實(shí)例而且客戶可以從一個(gè)眾所周知的訪問點(diǎn)訪問當(dāng)類只能由一個(gè)實(shí)例而且客戶可以從一個(gè)眾所周知的訪問點(diǎn)訪問它

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

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

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

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

41、協(xié)同接口的對(duì)象協(xié)同 Adaptee定義一個(gè)已經(jīng)存在的接口,這個(gè)接口需要適配定義一個(gè)已經(jīng)存在的接口,這個(gè)接口需要適配 Adapter對(duì)對(duì)Adaptee的接口與的接口與Target接口進(jìn)行適配接口進(jìn)行適配 協(xié)作 Client在在Adapter實(shí)例上調(diào)用一些操作。接著適配器調(diào)用實(shí)例上調(diào)用一些操作。接著適配器調(diào)用Adaptee的操作實(shí)現(xiàn)這個(gè)請求。的操作實(shí)現(xiàn)這個(gè)請求。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 將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。 解決2個(gè)方面的變化問題:抽象與實(shí)現(xiàn)。即一個(gè)類中多個(gè)方向的變化問題。 97/182 參與者參與者 Abstraction 定義抽象類的接口定義抽象類的接口 維護(hù)一個(gè)指向維護(hù)一個(gè)指向Implementor類型對(duì)象的指針類型對(duì)象的指針 RefinedAbstraction擴(kuò)充由Abstraction定義的接口 Implementor定義實(shí)現(xiàn)類的接口,該接口不一定要與Abstraction的接口完全一致。 Co

44、ncreteImplementor實(shí)現(xiàn)Implementor接口并定義它的具體實(shí)現(xiàn) 協(xié)作協(xié)作 Abstraction將Client的請求轉(zhuǎn)發(fā)給它的Implementor對(duì)象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)表示。 合成模式使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。102/182103/182 參與者 Component 為組合中的對(duì)象聲明接口 在適當(dāng)?shù)那闆r下,實(shí)現(xiàn)所有類共有接口的缺省行為 聲明一個(gè)接口用于訪問和管理Component的子組件 (可選)在遞歸結(jié)構(gòu)中定義一個(gè)接口,用于訪問一個(gè)父部件,并在合適的情況下實(shí)現(xiàn)它 Leaf 在組合中表示葉節(jié)點(diǎn)對(duì)象,葉節(jié)點(diǎn)沒有子節(jié)點(diǎn) 在組合中定義圖元對(duì)象的行為 Composite 定義有子部件的那些部件的行為 存儲(chǔ)子部件 在Component接口中實(shí)現(xiàn)與子部件有關(guān)的操作 Client 通過Component接口操

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

48、tPrice();/打折價(jià)格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意圖 動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)。就增加功能來說,動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)。就增加功能來說,Decorator模式相比生成子類更為靈活。模式相比生成子類更為靈活。一個(gè)類可能有些額外的責(zé)任(除了主體業(yè)務(wù)操作),如加密、緩存、壓縮等,這些可能只是輔助主體業(yè)務(wù)的附著,并不嚴(yán)格按照維度變化。裝飾模式以對(duì)客戶端透明的方式擴(kuò)展對(duì)象的功能,是繼承關(guān)系的一個(gè)替代方案,提供比繼承更多的靈活性。動(dòng)態(tài)給一個(gè)對(duì)象增加功能,這些功能可以再動(dòng)態(tài)的撤消

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

51、職責(zé)。協(xié)作Decorator將請求轉(zhuǎn)發(fā)給它的將請求轉(zhuǎn)發(fā)給它的Component對(duì)象,并有可能在轉(zhuǎn)發(fā)請求前對(duì)象,并有可能在轉(zhuǎn)發(fā)請求前后執(zhí)行一些附加的動(dòng)作后執(zhí)行一些附加的動(dòng)作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() + “ 正在進(jìn)行); 109/182外部與一個(gè)子系統(tǒng)的通信必須通過一個(gè)統(tǒng)一的門面對(duì)象進(jìn)行。門面模式提供一個(gè)高層次的接口,使得子系統(tǒng)更易于使用。每一個(gè)子系統(tǒng)只有一個(gè)門面類,而且此門面類只有一個(gè)實(shí)例,也就是說它是一個(gè)單例模式。但整個(gè)系統(tǒng)可以有多個(gè)門面類。 110/182 參與者參與者Facade 知道哪些子系統(tǒng)類負(fù)責(zé)處理請求知道哪些子系統(tǒng)類負(fù)責(zé)處理請求 將客戶的請求代理給

54、適當(dāng)?shù)淖酉到y(tǒng)對(duì)象將客戶的請求代理給適當(dāng)?shù)淖酉到y(tǒng)對(duì)象Subsystem 實(shí)現(xiàn)子系統(tǒng)的功能實(shí)現(xiàn)子系統(tǒng)的功能 處理由處理由FacadeFacade對(duì)象指派的任務(wù)對(duì)象指派的任務(wù) 沒有沒有FacadeFacade的任何相關(guān)信息;即沒有指向的任何相關(guān)信息;即沒有指向FacadeFacade的指針的指針 協(xié)作協(xié)作客戶程序通過發(fā)送給Facade的方式與子系統(tǒng)通訊, Facade將這些消息轉(zhuǎn)發(fā)給適當(dāng)?shù)淖酉到y(tǒng)對(duì)象。盡管是子系統(tǒng)中有關(guān)對(duì)象在做實(shí)際工作,但Facade模式本身也必須將它的接口轉(zhuǎn)換成子系統(tǒng)的接口。使用Facade的客戶程序不需要直接訪問子系統(tǒng)對(duì)象。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 享元模式以共享的方式高效的支持大量的細(xì)粒度對(duì)象。 采用類

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

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

58、戶調(diào)用Flywelght對(duì)象的操作時(shí),將該狀態(tài)傳遞給它。對(duì)象的操作時(shí),將該狀態(tài)傳遞給它。 用戶不應(yīng)直接對(duì)用戶不應(yīng)直接對(duì)ConcreteFlyweight類進(jìn)行實(shí)例話,類進(jìn)行實(shí)例話,而只能從而只能從FlywelghtFactory對(duì)象得到對(duì)象得到ConcreteFlyweight對(duì)象,這可以保證對(duì)它們適當(dāng)?shù)貙?duì)象,這可以保證對(duì)它們適當(dāng)?shù)剡M(jìn)行共享。進(jìn)行共享。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 代理模式給某一個(gè)對(duì)象提供一個(gè)代理對(duì)象,并由代理對(duì)象控制對(duì)源對(duì)象的引用。 代

溫馨提示

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

評(píng)論

0/150

提交評(píng)論