第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)

文檔簡介

軟件工程第13章軟件模式1模式很多系統(tǒng)的解決方案都比較類似解決方案的共同點(diǎn)是什么?區(qū)別在何處?用到哪些特殊的方法?如何制定一個(gè)特殊的方法?2Architecture,DesignandImplementation表示軟件系統(tǒng)的基本結(jié)構(gòu)化組織圖式。提供一個(gè)用于細(xì)化軟件系統(tǒng)的子系統(tǒng)或組件,或它們之間關(guān)系的圖式。3模式類別體系結(jié)構(gòu)模式可作為具體軟件體系結(jié)構(gòu)的模版。它們規(guī)定一個(gè)應(yīng)用的系統(tǒng)范圍的結(jié)構(gòu)特性,以及對其子系統(tǒng)的體系結(jié)構(gòu)施加的影響。體系結(jié)構(gòu)模式的選擇是開發(fā)一個(gè)軟件系統(tǒng)時(shí)的基本設(shè)計(jì)決策。4模式類別設(shè)計(jì)模式軟件體系結(jié)構(gòu)的子系統(tǒng),以及它們之間的關(guān)系。通常由幾個(gè)更小的體系結(jié)構(gòu)單元構(gòu)成。中等規(guī)模的模式。規(guī)模上比體系結(jié)構(gòu)模式小,但又獨(dú)立于特定編程語言。設(shè)計(jì)模式的應(yīng)用對軟件系統(tǒng)的基礎(chǔ)結(jié)構(gòu)沒有影響,但可能對子系統(tǒng)的體系結(jié)構(gòu)有所影響。提供分解更復(fù)雜的服務(wù)或組件的結(jié)構(gòu),以及它們之間的合作。5模式類別慣用法處理特定設(shè)計(jì)問題的實(shí)現(xiàn)代表最低層模式,關(guān)注設(shè)計(jì)和實(shí)現(xiàn)方面針對具體語言,捕獲現(xiàn)有的編程經(jīng)驗(yàn)6Patterncharacteristics

一個(gè)模式關(guān)注一個(gè)在特定設(shè)計(jì)環(huán)境中出現(xiàn)的設(shè)計(jì)問題,并為它提供一個(gè)解決方案。各種模式用文檔記錄下現(xiàn)存的經(jīng)過充分考驗(yàn)的設(shè)計(jì)經(jīng)驗(yàn)。模式為設(shè)計(jì)原則提供一種公共的詞匯和理解。模式是為軟件體系結(jié)構(gòu)建立文檔的一種手段。模式支持用已定義的屬性來構(gòu)造軟件。7Patternschema語境:問題出現(xiàn)的場景問題:在那個(gè)語境中出現(xiàn)的再現(xiàn)問題解決方案必須滿足的需求必須考慮的約束解決方案必須具有的特性解決方案:已被證實(shí)的問題的解決方案特定的結(jié)構(gòu):組件和關(guān)系的結(jié)構(gòu)運(yùn)行期的行為8Patternschema模式的圖式:9內(nèi)容摘要架構(gòu)模式設(shè)計(jì)模式物理體系結(jié)構(gòu)建模10內(nèi)容摘要架構(gòu)模式設(shè)計(jì)模式物理體系結(jié)構(gòu)建模11ArchitecturePatterns一個(gè)軟件體系結(jié)構(gòu)的模式描述了一個(gè)出現(xiàn)在特定設(shè)計(jì)語境中的特殊的再現(xiàn)設(shè)計(jì)問題,并為它的解決方案提供了一個(gè)經(jīng)過充分驗(yàn)證的通用圖式。一組預(yù)先確定的子系統(tǒng)和他們的職責(zé)子系統(tǒng)間的相互關(guān)聯(lián)的規(guī)則例如:Model-View-Controller模式12Pattern:Layers13Pattern:Layers

層體系結(jié)構(gòu)模式有助于構(gòu)建這樣的應(yīng)用:它能被分解成子任務(wù)組,其中每個(gè)子任務(wù)組處于一個(gè)特定的抽象層次上。下層為上層提供服務(wù)上層利用下層提供的服務(wù)完成自身的任務(wù)通過同步程序調(diào)用來完成請求的服務(wù)14Pattern:Layers

ISOOpenSystemsInterconnect7-layermodel15Patternschema一個(gè)獨(dú)立層的描述16Pattern:Layers舉例:虛擬機(jī)e.g.JVM舉例:

APIse.g.Cstandardlibrary,builtonUnixsystemcalls舉例:信息系統(tǒng)應(yīng)用層——數(shù)據(jù)庫表示層——應(yīng)用邏輯層——領(lǐng)域?qū)印獢?shù)據(jù)庫17Pattern:Layers舉例:WindowsNT系統(tǒng)服務(wù):子系統(tǒng)和NT執(zhí)行程序之間的接口層資源管理器層:包含對象管理器、安全引用監(jiān)視器、過程管理器、I/O管理器、虛擬存儲管理器和局部過程調(diào)用等模塊。內(nèi)核:它關(guān)心一些基本功能,如中斷和意外處理、多處理器同步、線程調(diào)度和現(xiàn)程分配。硬件抽象層(HAL):隱藏了不同處理器系列機(jī)器之間的硬件差異。硬件18Three-LayeredEnterpriseApplication19Pattern:Layers優(yōu)點(diǎn):層的重用標(biāo)準(zhǔn)化支持局部性依賴可替換性不足更改行為的重疊降低效率不必要的工作難以認(rèn)可層的正確粒度20Pattern:Model-View-Controller21Pattern:Model-View-Controller將一個(gè)交互式應(yīng)用程序分為三個(gè)組件。模型(Model):核心功能和數(shù)據(jù)視圖(Views):向用戶顯示信息控制器(Controllers):處理用戶輸入視圖和控制器共同構(gòu)成了用戶接口變更-傳播機(jī)制確保了用戶接口和模型之間的一致性22Pattern:Model-View-Controller23Pattern:Model-View-Controller24Pattern:Model-View-Controller相同的信息在不同的窗口有不同的表示支持不同的“樣式和感覺”標(biāo)準(zhǔn)模型獨(dú)立于表示布告形式連接觀察者設(shè)計(jì)模式舉例:SmalltalkASP.NET.aspx:視圖.VB,.C#:控制25Pattern:Client-Server26Pattern:Client-Server服務(wù)器端為客戶端提供服務(wù)客戶端從服務(wù)器端請求服務(wù)服務(wù)器一直保持監(jiān)聽請求的狀態(tài)舉例:遠(yuǎn)程數(shù)據(jù)庫連接遠(yuǎn)程文件系統(tǒng)多層信息系統(tǒng)Web應(yīng)用27Pattern:Master-Slave28Pattern:Master-Slave支持容錯(cuò)性、并行計(jì)算以及計(jì)算準(zhǔn)確性。主控組件將工作分配給相同的從屬組件,并從從屬組件返回的結(jié)果中計(jì)算最終的結(jié)果。舉例:嵌入式系統(tǒng)大規(guī)模并行計(jì)算容錯(cuò)系統(tǒng)29Pattern:Master-Slave30Pattern:Master-Slave31Pattern:Master-Slave主控模塊故障,整個(gè)系統(tǒng)故障主控模塊將任務(wù)劃分為幾個(gè)同等的子任務(wù)從屬之間相互獨(dú)立從屬之間并行工作問題是可以分解的應(yīng)用領(lǐng)域:容錯(cuò)并行計(jì)算計(jì)算準(zhǔn)確性32Pattern:Master-Slave優(yōu)點(diǎn):可互換性和可擴(kuò)充性事務(wù)分離效率不足:可行性對機(jī)器依賴性難以實(shí)現(xiàn)可移植性33Pattern:Pipe-Filter34Pattern:Pipe-Filter管道和過濾器體系結(jié)構(gòu)模式,為處理數(shù)據(jù)流的系統(tǒng)提供了一種結(jié)構(gòu)每個(gè)處理步驟封裝在一個(gè)過濾器組件中數(shù)據(jù)通過相鄰過濾器之間的管道傳輸管道處理緩沖和同步重組過濾器可以建立相關(guān)系統(tǒng)族舉例:編譯器Unix內(nèi)核命令35Pattern:Pipe-Filter36Pattern:Pipe-Filter37Pattern:Pipe-Filter優(yōu)點(diǎn):通過過濾器交換增加了靈活性通過重組增加了靈活性過濾器組件的重用并行處理提高效率不足:共享狀態(tài)信息或者昂貴或者不靈活并行處理獲得的效率往往只一種假象數(shù)據(jù)轉(zhuǎn)換額外開銷錯(cuò)誤處理38Pattern:Broker39Pattern:Broker代理者結(jié)構(gòu)模式可以用于構(gòu)建帶有隔離組件的分布式軟件系統(tǒng),該軟件通過遠(yuǎn)程服務(wù)調(diào)用進(jìn)行交互。代理者組件負(fù)責(zé)協(xié)調(diào)通信轉(zhuǎn)發(fā)請求、傳送結(jié)果和異常服務(wù)器將他們的服務(wù)(屬性和操作)發(fā)布給一個(gè)代理客戶端通過一個(gè)代理請求服務(wù)器處理代理將請求發(fā)送給一個(gè)合適的服務(wù)器處理40Pattern:Broker允許動態(tài)改變、添加、刪除和重新發(fā)布對于開發(fā)者來說,代理是透明的請求需要有標(biāo)準(zhǔn)的表示法當(dāng)兩個(gè)代理者互操作時(shí),實(shí)現(xiàn)細(xì)節(jié)可通過網(wǎng)橋來隱藏舉例:公共對象請求代理體系結(jié)構(gòu)(CORBA),處理異構(gòu)系統(tǒng)上分布式對象的面向?qū)ο蠹夹g(shù)Webservices41Pattern:Broker42Pattern:Peer-2-Peer43Pattern:Peer-2-Peer對稱的客戶機(jī)-服務(wù)器模式客戶機(jī)向服務(wù)器請求服務(wù)服務(wù)器通知客戶機(jī)特定的事件任何一個(gè)節(jié)點(diǎn)都可以扮演客戶機(jī)或者服務(wù)器的角色可以動態(tài)的交換角色舉例:多用戶應(yīng)用P2P技術(shù)44Pattern:Event-Bus45Pattern:Event-Bus事件源將消息發(fā)布到總線上的特殊通道上事件監(jiān)聽者訂閱通道上的消息監(jiān)聽者監(jiān)聽有效消息消息是異步的通路可以是固定的46Pattern:Blackboard47Pattern:Blackboard黑板體系結(jié)構(gòu)模式對于無確定性求解策略的問題比較有用。黑板模式中,有幾個(gè)專用子系統(tǒng)收集其知識,以建立一個(gè)可能的部分解或近似解。舉例:語音識別所有組件共享數(shù)據(jù)存儲(黑板)組件生成新的數(shù)據(jù)更新到黑板組件監(jiān)視黑板上的數(shù)據(jù)利用匹配模式尋找特定的數(shù)據(jù)48Pattern:Blackboard49Pattern:Blackboard50Pattern:Blackboard優(yōu)點(diǎn):對可更改性和可維護(hù)性的支持可重用的知識源支持容錯(cuò)性和健壯性不足:測試?yán)щy不能保證有好的求解方案難以建立一個(gè)好的控制策略低效昂貴的開發(fā)工作缺少對并行機(jī)制的支持51內(nèi)容摘要架構(gòu)模式設(shè)計(jì)模式物理體系結(jié)構(gòu)建模5223種設(shè)計(jì)模式簡介Abstractfactory(抽象工廠)提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無需制定它們具體的類。Adapter(適配器)將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另一個(gè)接口。它使得原本由于接口不兼容而不能在一起工作的那些類可以在一起工作。Bridge(橋接)將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立的變化。5323種設(shè)計(jì)模式簡介Builder(生成器)將一個(gè)復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。ChainofResponsibility(職責(zé)鏈)為解除請求的發(fā)送者和接受者之間的耦合,而使多個(gè)對象都有機(jī)會處理這個(gè)請求。將這些對象連成一條鏈,并沿著這個(gè)鏈傳遞該請求,直到有一個(gè)對象處理它。Command(命令)將一個(gè)請求封裝成一個(gè)對象,從而使你可用不同的請求對客戶進(jìn)行參數(shù)化;對請求排隊(duì)或記錄請求日志,以及支持可取消的操作。5423種設(shè)計(jì)模式簡介Composite(組成)將對象組合成樹型結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)。它使得客戶對單個(gè)對象和復(fù)合對象的使用具有一致性。Decorator(裝飾)動態(tài)的給一個(gè)對象添加一些額外的職責(zé)。就擴(kuò)展功能而言,該模式比生成子類的方式更為靈活。Facade(外觀)為子系統(tǒng)中的一組接口提供一個(gè)已知的界面,該模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用。5523種設(shè)計(jì)模式簡介FactoryMethod(工廠方法)定義一個(gè)用于創(chuàng)建對象的接口,讓子類決定將哪一個(gè)類實(shí)例化。它使得一個(gè)類的實(shí)例化延遲到其子類。Flyweight(享元)運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對象。Interpreter(解釋器)給定一個(gè)語言,定義它的文法的一種表示,并定義一個(gè)解釋器,該解釋器使用該表示來解釋語言中的句子。5623種設(shè)計(jì)模式簡介Iterator(迭代器)提供一種方法順序訪問一個(gè)聚合對象中的各個(gè)元素,而又不需暴露該對象的內(nèi)部表示。Mediator(中介者)用一個(gè)中介對象來封裝一些列的對象交互。中介者使各對象不需要顯示地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互。Memento(備忘錄)在不破壞封裝性的前提下,捕獲一個(gè)對象的內(nèi)部狀態(tài),并在該對象之外保存這個(gè)狀態(tài)。這樣以后就可將該對象恢復(fù)到保存的狀態(tài)。5723種設(shè)計(jì)模式簡介Observer(觀察者)定義對象間的一種一對多的依賴關(guān)系,以便當(dāng)一個(gè)對象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對象都得到通知并自動刷新。Prototype(原型)用原型實(shí)例制定創(chuàng)建對象的種類,并通過拷貝這個(gè)原型來創(chuàng)建新的對象。Proxy(代理)為其他對象提供一個(gè)代理以控制對這個(gè)對象的訪問。5823種設(shè)計(jì)模式簡介Singleton(單件)保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)。State(狀態(tài))允許一個(gè)對象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為。對象看起來似乎修改了他所屬的類。Strategy(策略)定義一系列算法,把它們一個(gè)個(gè)封裝起來,并且使它們可相互替換。本模式使得算法的變化可獨(dú)立于使用它的客戶。5923種設(shè)計(jì)模式簡介TemplateMethod(模版方法)定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類中。該模式使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。Visitor(訪問者)表示一個(gè)作用于某對象結(jié)構(gòu)中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。60模式分類目的創(chuàng)建型結(jié)構(gòu)型行為型范圍類FactoryMethodAdapter(類)InterpreterTemplateMethod對象AbstractFactoryBuilderPrototypeSingletonAdapter(對象)BridgeCompositeDecoratorFa?adeFlyweightProxyChainofResponsibilityCommandIteratorMediatorMementoObserverStateStrategyVisitor61設(shè)計(jì)模式優(yōu)點(diǎn)面向接口編程創(chuàng)建型模式確保系統(tǒng)是采用針對接口的方式書寫的,而不是針對實(shí)現(xiàn)而書寫的。降低耦合性增加靈活性62設(shè)計(jì)模式創(chuàng)建型模式將系統(tǒng)使用哪些具體的類的信息封裝起來隱藏了這些類的實(shí)例是如何被創(chuàng)建和放在一起的63設(shè)計(jì)模式之Factory-工廠模式客戶類和工廠類分開??蛻羧魏螘r(shí)候需要某種產(chǎn)品,只需向工廠請求即可??蛻魺o須修改就可以接納新產(chǎn)品。缺點(diǎn)是當(dāng)產(chǎn)品修改時(shí),工廠類也要做相應(yīng)的修改。64656667設(shè)計(jì)模式之Factory-工廠模式68FACTORYMETHOD-工廠方法69FACTORYMETHOD-工廠方法意圖定義一個(gè)用于創(chuàng)建對象的接口,讓子類決定實(shí)例化哪一個(gè)類。FactoryMethod使一個(gè)類的實(shí)例化延遲到其子類。

適用性:當(dāng)一個(gè)類不知道它所必須創(chuàng)建的對象的類的時(shí)候;當(dāng)一個(gè)類希望由它的子類來指定它所創(chuàng)建的對象的時(shí)候當(dāng)類將創(chuàng)建對象的職責(zé)委托給多個(gè)幫助子類的某一個(gè),并且你希望將哪一個(gè)幫助子類是代理者這一信息局部化的時(shí)候70FACTORYMETHOD-工廠方法結(jié)構(gòu)參與者Product——定義工廠方法所創(chuàng)建的對象的接口ConcreteProduct——實(shí)現(xiàn)Product接口Creator——聲明工廠方法,該方法返回一個(gè)Product類型的對象??梢哉{(diào)用工廠方法以創(chuàng)建一個(gè)Product對象。ConcreteCreator——重定義工廠方法以返回一個(gè)ConcreteProduct實(shí)例71FACTORYMETHOD-工廠方法協(xié)作Creator依賴于它的子類來定義工廠方法,所以它返回一個(gè)適當(dāng)?shù)腃oncreteProduct實(shí)例72publicabstractclassCarFactory{

publicabstractCarcreator();}publicclassVM1FactoryextendsFactory{ publicCarcreator(){

.........

returnnewCar

}}publicclassVM2FactoryextendsFactory{ publicCarcreator(){

......

returnnewCar

}}73AbstractFactory–抽象工廠意圖提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無需指定它們具體的類。74AbstractFactory–抽象工廠參與者AbstractFactory——聲明一個(gè)創(chuàng)建抽象產(chǎn)品對象的操作接口ConcreteFactory——實(shí)現(xiàn)創(chuàng)建具體產(chǎn)品對象的操作AbstractProduct——為一類產(chǎn)品對象聲明一個(gè)接口ConcreteProduct定義一個(gè)將被相應(yīng)的具體工廠創(chuàng)建的產(chǎn)品對象實(shí)現(xiàn)AbstractProduct接口Client僅使用由AbstractFactory和AbstractProduct類聲明的接口協(xié)作通常在運(yùn)行時(shí)刻創(chuàng)建一個(gè)ConcreteFactory類的實(shí)例。這一具體的工廠創(chuàng)建具有特定實(shí)現(xiàn)的產(chǎn)品對象。為創(chuàng)建不同的產(chǎn)品對象,客戶應(yīng)適用不同的具體工廠。AbstractFactory將產(chǎn)品對象的創(chuàng)建延遲到它的ConcreteFactory子類。75publicabstractclassCarFactory{

publicabstractCarcreator();

publicabstractTruckcreator(Strings);}publicclassVM1FactoryextendsFactory{

publicCarcreator(){

.........

returnnewJetta

}

publicTruckcreator(Strings){

.........

returnnewBigBig

}}publicclassVM2extendsFactory{

publicCarcreator(){

......

returnnewPolo

}

publicTruckcreator(Strings){

......

returnnewLLL

}}76AbstractFactory–抽象工廠與FactoryMethod模式的比較FactoryMethod模式利用給Factory對象傳遞不同的參數(shù),以返回具有相同基類或?qū)崿F(xiàn)了同一接口的對象AbstractFactory模式先利用Factory模式返回Factory對象,再通過Factory對象返回不同的對象77Builder-建造模式將一個(gè)復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。

建造模式可以強(qiáng)制實(shí)行一種分步驟進(jìn)行的建造過程。78Builder-建造模式參與者:Builder——為創(chuàng)建一個(gè)Product對象的各個(gè)部件制定抽象接口。ConcreteBuilder實(shí)現(xiàn)Builder的接口以構(gòu)造和裝配該產(chǎn)品的各個(gè)部件定義并明確它所創(chuàng)建的表示提供一個(gè)檢索產(chǎn)品的接口Derector——構(gòu)造一個(gè)使用Builder接口的對象Product表示被構(gòu)造的復(fù)雜對象包含定義組成部件的類79Builder-建造模式協(xié)作:客戶創(chuàng)建Director對象,并用它所想要的Builder對象進(jìn)行配置一旦產(chǎn)品部件被生成,導(dǎo)向器就會通知生成器生成器處理導(dǎo)向器的請求,并將部件添加到該產(chǎn)品中客戶從生成器中檢索產(chǎn)品80publicinterfaceBuilder{

//創(chuàng)建部件A:比如汽車車輪

voidbuildPartA();

//創(chuàng)建部件B:比如方向盤

voidbuildPartB();

//創(chuàng)建部件C:比如發(fā)動機(jī)

voidbuildPartC();

//返回最終組裝產(chǎn)品成果(返回最后裝配好的汽車)

//成品的組裝過程不在這里進(jìn)行,而是轉(zhuǎn)移到下面的Director中進(jìn)行。

//從而實(shí)現(xiàn)過程與部件的解耦。

ProductgetResult();}publicclassDirector{

privateBuilderbuilder; publicDirector(Builderbuilder){

this.builder=builder;

}

//將partA,partB,partC最后組成復(fù)雜物件

//汽車的組裝過程

publicvoidconstruct(){

builder.buildPartA();

builder.buildPartB();

builder.buildPartC();

}}81PROTOTYPE-原型模式意圖用原型實(shí)例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象。其實(shí)是將product和factory功能合二為一了。缺點(diǎn)是每一個(gè)類都必須配備一個(gè)克隆方法。適用性:當(dāng)一個(gè)系統(tǒng)應(yīng)該獨(dú)立于它的產(chǎn)品創(chuàng)建、構(gòu)成和表示時(shí),要使用Prototype模式;以及當(dāng)要實(shí)例化的類是在運(yùn)行時(shí)刻指定時(shí);或者為了避免創(chuàng)建一個(gè)與產(chǎn)品類層次平行的工廠類層次時(shí);或者當(dāng)一個(gè)類的實(shí)例只能由幾個(gè)不同狀態(tài)組合中的一種時(shí)。建立相應(yīng)數(shù)目的原型并克隆它們可能比每次用合適的狀態(tài)手工實(shí)例化該類更方便一些。82PROTOTYPE-原型模式參與者Prototype——聲明一個(gè)克隆自身的接口。ConcretePrototype——實(shí)現(xiàn)一個(gè)克隆自身的操作。Client——讓一個(gè)原型克隆自身從而創(chuàng)建一個(gè)新的對象。協(xié)作客戶請求一個(gè)原型克隆自身83publicabstractclassAbstractSpoonimplementsCloneable

{

StringspoonName;

publicvoidsetSpoonName(String

spoonName){this.spoonName=spoonName;}

publicStringgetSpoonName(){returnthis.spoonName;}

publicObjectclone()

{

Objectobject=null;

try{

object=super.clone();

}catch(CloneNotSupportedExceptionexception){

System.err.println("AbstractSpoonisnotCloneable");

}

returnobject;

}

}

publicclassSoupSpoonextendsAbstractSpoon

{

publicSoupSpoon()

{

setSpoonName("SoupSpoon");

}

}publicclassSaladSpoonextendsAbstractSpoon

{

publicSaladSpoon()

{

setSpoonName("SaladSpoon");

}

}84設(shè)計(jì)模式之Singleton-單例模式意圖保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)。

類自身負(fù)責(zé)保存它的唯一實(shí)例。解決的主要是性能問題,而非耦合(變化)的問題。適用性當(dāng)類只能由一個(gè)實(shí)例而且客戶可以從一個(gè)眾所周知的訪問點(diǎn)訪問它時(shí)當(dāng)這個(gè)唯一實(shí)例應(yīng)該是通過子類化可擴(kuò)展的,并且客戶應(yīng)該無需更改代碼就能使用一個(gè)擴(kuò)展的實(shí)例時(shí)。85設(shè)計(jì)模式之Singleton-單例模式參與者Singleton定義一個(gè)Instance操作,允許客戶訪問它的唯一實(shí)例??赡茇?fù)責(zé)創(chuàng)建它自己的唯一實(shí)例。協(xié)作客戶只能通過Singleton的Instance操作訪問一個(gè)Singleton實(shí)例。86publicclassSingleton{

privatestaticSingletoninstance=null;

publicstaticsynchronizedSingletongetInstance(){

//這個(gè)方法比上面有所改進(jìn),不用每次都進(jìn)行生成對象,

//只是第一次使用時(shí)生成實(shí)例,提高了效率!

if(instance==null)

instance=newSingleton();

returninstance;

}}

87創(chuàng)建型模式小結(jié)創(chuàng)建型模式規(guī)定了創(chuàng)建對象的方式。在必須決定實(shí)例化某個(gè)類時(shí),使用這些模式。通常,由抽象超類封裝實(shí)例化類的細(xì)節(jié),這些細(xì)節(jié)包括這些類確切是什么,以及如何及何時(shí)創(chuàng)建這些類。對客戶類來講,這些類的細(xì)節(jié)是隱藏的??蛻纛愔恢莱橄箢惢虺橄箢悓?shí)現(xiàn)的接口??蛻纛愅ǔ2⒉恢谰唧w類的確切類型。當(dāng)系統(tǒng)演化依賴于對象的組合、聚集時(shí),創(chuàng)建型模式帶來了更大的靈活性。88設(shè)計(jì)模式結(jié)構(gòu)型模式如何組合類和對象以獲得更大的結(jié)構(gòu)類模型采用繼承機(jī)制來組合接口或?qū)崿F(xiàn),如采用多重繼承方法將兩個(gè)以上的類組合成一個(gè)類對象模式不是對接口和實(shí)現(xiàn)進(jìn)行組合,它描述了如何對一些對象進(jìn)行組合,從而實(shí)現(xiàn)新功能的一些方法。在運(yùn)行時(shí)刻改變對象組合關(guān)系,具有更大的靈活性。89Adapter-適配器把一個(gè)類的接口變換成客戶端所期待的另一種接口,從而使原本因接口原因不匹配而無法一起工作的兩個(gè)類能夠一起工作。適配類可以根據(jù)參數(shù)返還一個(gè)合適的實(shí)例給客戶端。90使用多重繼承對一個(gè)接口與另一個(gè)接口進(jìn)行匹配91對象匹配器依賴于對象組合92Adapter-適配器參與者Target——定義Client使用的與特定另一相關(guān)的接口Client——與符合Target接口的對象協(xié)同Adaptee——定義一個(gè)已經(jīng)存在的接口,這個(gè)接口需要適配Adapter——對Adaptee的接口與Target接口進(jìn)行適配協(xié)作Client在Adapter實(shí)例上調(diào)用一些操作。接著適配器調(diào)用Adaptee的操作實(shí)現(xiàn)這個(gè)請求。93publicinterfaceIRoundPeg{

publicvoidinsertIntoHole(String

msg);}publicinterfaceISquarePeg{

publicvoidinsert(String

str);}publicclassPegAdapterimplementsIRoundPeg,ISquarePeg{

privateRoundPeg

roundPeg;

privateSquarePeg

squarePeg;

//構(gòu)造方法

publicPegAdapter(RoundPeg

peg){this.roundPeg=peg;}//構(gòu)造方法

publicPegAdapter(SquarePeg

peg){this.squarePeg=peg;}

publicvoidinsert(String

str){roundPeg.insertIntoHole(str);}

publicvoidinsertIntoHole(String

str){SquarePeg.insert(str);}}9495Bridge-橋梁模式將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。解決2個(gè)方面的變化問題:抽象與實(shí)現(xiàn)。即一個(gè)類中多個(gè)方向的變化問題。96Bridge-橋梁模式參與者Abstraction定義抽象類的接口維護(hù)一個(gè)指向Implementor類型對象的指針RefinedAbstraction——擴(kuò)充由Abstraction定義的接口Implementor——定義實(shí)現(xiàn)類的接口,該接口不一定要與 Abstraction的接口完全一致。ConcreteImplementor——實(shí)現(xiàn)Implementor接口并定義它的具體 實(shí)現(xiàn)協(xié)作Abstraction將Client的請求轉(zhuǎn)發(fā)給它的Implementor對象97publicabstractclassCoffee

{

CoffeeImp

coffeeImp;

publicvoidsetCoffeeImp(){

this.CoffeeImp=CoffeeImpSingleton.getTheCoffeImp();

}

publicSodaImp

getCoffeeImp(){returnthis.CoffeeImp;}

publicabstractvoidpourCoffee();

}publicabstractclassCoffeeImp

{

publicabstractvoidpourCoffeeImp();

}//bridgepublicclassCoffeeImpSingleton

{privatestaticCoffeeImp

coffeeImp;

publicCoffeeImpSingleton(CoffeeImp

coffeeImpIn)

{this.coffeeImp=coffeeImpIn;}

publicstaticCoffeeImp

getTheCoffeeImp()

{

returncoffeeImp;

}

}

9899Bridge-橋梁模式100Composite-合成模式合成模式把部分與整體關(guān)系用樹結(jié)構(gòu)表示。合成模式使得用戶對單個(gè)對象和組合對象的使用具有一致性。101102Composite-合成模式參與者Component為組合中的對象聲明接口在適當(dāng)?shù)那闆r下,實(shí)現(xiàn)所有類共有接口的缺省行為聲明一個(gè)接口用于訪問和管理Component的子組件(可選)在遞歸結(jié)構(gòu)中定義一個(gè)接口,用于訪問一個(gè)父部件,并在合適的情況下實(shí)現(xiàn)它Leaf在組合中表示葉節(jié)點(diǎn)對象,葉節(jié)點(diǎn)沒有子節(jié)點(diǎn)在組合中定義圖元對象的行為Composite定義有子部件的那些部件的行為存儲子部件在Component接口中實(shí)現(xiàn)與子部件有關(guān)的操作Client通過Component接口操縱組合部件的對象103Composite-合成模式協(xié)作用戶使用Component類接口與組合結(jié)構(gòu)中的對象進(jìn)行交互。如果接收者是一個(gè)葉節(jié)點(diǎn),則直接處理請求。如果接收者是Composite,它通常將請求發(fā)送給它的子部件,在轉(zhuǎn)發(fā)請求之前與/或之后,可能執(zhí)行一些輔助操作。104publicabstractclassEquipment{

privateStringname;

//網(wǎng)絡(luò)價(jià)格

publicabstractdoublenetPrice();

//打折價(jià)格

publicabstractdoublediscountPrice();

//增加部件

publicboolean

add(Equipmentequipment){returnfalse;}

//刪除部件

publicboolean

remove(Equipmentequipment){returnfalse;}

//注意這里,提供一種用于訪問組合部件的方法。

publicIterator

iter(){returnnull;}

publicEquipment(finalStringname){=name;}}

publicclassDiskextendsEquipmentabstractclassCompositeEquipmentextendsEquipment105DECORATOR-裝飾模式意圖動態(tài)地給一個(gè)對象添加一些額外的職責(zé)。就增加功能來說,Decorator模式相比生成子類更為靈活。一個(gè)類可能有些額外的責(zé)任(除了主體業(yè)務(wù)操作),如加密、緩存、壓縮等,這些可能只是輔助主體業(yè)務(wù)的附著,并不嚴(yán)格按照維度變化。裝飾模式以對客戶端透明的方式擴(kuò)展對象的功能,是繼承關(guān)系的一個(gè)替代方案,提供比繼承更多的靈活性。動態(tài)給一個(gè)對象增加功能,這些功能可以再動態(tài)的撤消。增加由一些基本功能的排列組合而產(chǎn)生的非常大量的功能。既繼承又組合,實(shí)際上是將Bridge中的抽象和實(shí)現(xiàn)合二為一了,是其特殊形式。

106參與者Component——定義一個(gè)對象接口,可以給這些對象動態(tài)地添加職責(zé)。ConcreteComponent——定義一個(gè)對象,可以給這個(gè)對象添加一些職責(zé)。Decorator——維持一個(gè)指向Component對象的指針,并定義一個(gè)與 Component接口一致的接口ConcreteDecorator——向組件添加職責(zé)。協(xié)作Decorator將請求轉(zhuǎn)發(fā)給它的Component對象,并有可能在轉(zhuǎn)發(fā)請求前后執(zhí)行一些附加的動作107publicinterfaceWork{

publicvoidinsert();}publicclassSquarePegimplementsWork{

publicvoidinsert(){

System.out.println(“方形杵插入");

}}publicclassDecoratorimplementsWork{

privateWorkwork;

//額外增加的功能打包在List中

privateArrayListothers=newArrayList();

//在構(gòu)造器中使用組合new方式,引入Work;

publicDecorator(Workwork){

this.work=work;

others.add(“挖坑");

others.add(“釘木板");

}

publicvoidinsert(){

newMethod();

}

//新方法中在insert之前增加其他方法,這里次序先后是用戶靈活指定的

publicvoidnewMethod(){

otherMethod();

work.insert();

}

publicvoidotherMethod(){

ListIterator

listIterator=others.listIterator();

while(listIterator.hasNext())

{

System.out.println(((String)(listIterator.next()))+“正在進(jìn)行");

}

}}108Facade-門面模式外部與一個(gè)子系統(tǒng)的通信必須通過一個(gè)統(tǒng)一的門面對象進(jìn)行。門面模式提供一個(gè)高層次的接口,使得子系統(tǒng)更易于使用。每一個(gè)子系統(tǒng)只有一個(gè)門面類,而且此門面類只有一個(gè)實(shí)例,也就是說它是一個(gè)單例模式。但整個(gè)系統(tǒng)可以有多個(gè)門面類。109Facade-門面模式參與者Facade知道哪些子系統(tǒng)類負(fù)責(zé)處理請求將客戶的請求代理給適當(dāng)?shù)淖酉到y(tǒng)對象Subsystem實(shí)現(xiàn)子系統(tǒng)的功能處理由Facade對象指派的任務(wù)沒有Facade的任何相關(guān)信息;即沒有指向Facade的指針協(xié)作客戶程序通過發(fā)送給Facade的方式與子系統(tǒng)通訊,F(xiàn)acade將這些消息轉(zhuǎn)發(fā)給適當(dāng)?shù)淖酉到y(tǒng)對象。盡管是子系統(tǒng)中有關(guān)對象在做實(shí)際工作,但Facade模式本身也必須將它的接口轉(zhuǎn)換成子系統(tǒng)的接口。使用Facade的客戶程序不需要直接訪問子系統(tǒng)對象。110publicclassDBCompare{ Stringsql=“SELECT*FROM<table> WHERE<columnname>=?”;

try{

Mysql

msql=newmysql(sql);

prep.setString(1,“<columnvalue>”);

rset=prep.executeQuery();

if(rset.next()){

System.out.println(rset.getString(“<columnname>”));

}

}catch(SExceptione){

e.printStackTrace();

}finally{

mysql.close();

mysql=null;

}

}111FLYWEIGHT-享元模式享元模式以共享的方式高效的支持大量的細(xì)粒度對象。采用類似于Hash表的方式,共享的思想??蛻舳瞬豢梢灾苯觿?chuàng)建被共享的對象,而應(yīng)當(dāng)使用一個(gè)工廠對象負(fù)責(zé)創(chuàng)建被共享的對象。享元模式大幅度的降低內(nèi)存中對象的數(shù)量,主要解決OO性能問題。112113FLYWEIGHT-享元模式參與者Flyweight描述一個(gè)接口,通過這個(gè)接口Flyweight可以接受并作用于外部狀態(tài)。ConcreteFlyweight實(shí)現(xiàn)Flyweight接口,并為內(nèi)部狀態(tài)(如果有的話)增加存儲空間。UnsharedConcreteFlyweight并非所有的Flyweight子類都需要被共享。Flyweight接口使共享成為可能,但它并不強(qiáng)制共享。在Flyweight對象結(jié)構(gòu)的某些層次,UnsharedConcreteFlyweight對象通常將ConcreteFlyweight對象作為子節(jié)點(diǎn)。FlyweightFactory創(chuàng)建并管理Flyweight對象確保合理地共享Flyweight。Client維持一個(gè)對Flyweight的引用計(jì)算或存儲一個(gè)(多個(gè))Flyweight的外部狀態(tài)114FLYWEIGHT-享元模式協(xié)作Flywelght執(zhí)行時(shí)所需的狀態(tài)必定是內(nèi)部的或外部的。內(nèi)部狀態(tài)存儲于ConcreteFlyweight對象之中;而外部對象則由Client對象存儲或計(jì)算。當(dāng)用戶調(diào)用Flywelght對象的操作時(shí),將該狀態(tài)傳遞給它。用戶不應(yīng)直接對ConcreteFlyweight類進(jìn)行實(shí)例話,而只能從FlywelghtFactory對象得到ConcreteFlyweight對象,這可以保證對它們適當(dāng)?shù)剡M(jìn)行共享。115publicclassCD{

privateStringtitle;

privateintyear;

privateArtistartist;

publicStringgetTitle(){returntitle;}

publicint

getYear(){returnyear;}

publicArtistgetArtist(){returnartist;}

publicvoidsetTitle(Stringt){title=t;}

publicvoidsetYear(inty){year=y;}

publicvoidsetArtist(Artista){artist=a;}}publicclassArtist{

//內(nèi)部狀態(tài)

privateStringname;

//notethatArtistisimmutable.

StringgetName(){returnname;}

Artist(Stringn){name=n;}}publicclassArtistFactory{

Hashtablepool=newHashtable();

ArtistgetArtist(Stringkey){

Artistresult; result=(Artist)pool.get(key); //產(chǎn)生新的Artist

if(result==null){

result=newArtist(key);

pool.put(key,result);

}

returnresult; }}116PROXY-代理模式代理模式給某一個(gè)對象提供一個(gè)代理對象,并由代理對象控制對源對象的引用。代理就是一個(gè)人或一個(gè)機(jī)構(gòu)代表另一個(gè)人或者一個(gè)機(jī)構(gòu)采取行動。代理對象可以在客戶和目標(biāo)對象直接起到中介的作用??蛻舳朔直娌怀龃碇黝}對象與真實(shí)主題對象。代理模式可以并不知道真正的被代理對象,而僅僅持有一個(gè)被代理對象的接口,這時(shí)候代理對象不能夠創(chuàng)建被代理對象,被代理對象必須有系統(tǒng)的其他角色代為創(chuàng)建并傳入。117118PROXY-代理模式參與者Proxy保存一個(gè)引用使得代理可以訪問實(shí)體。提供一個(gè)與Subject的接口相同的接口,這樣代理就可以用來代替實(shí)體??刂茖?shí)體的存取,并可能負(fù)責(zé)創(chuàng)建和刪除它。Subject定義RealSubject和Proxy的公共接口,這樣就在任何使用RealSubject的地方都可以使用Proxy。RealSubject定義Proxy對代表的實(shí)體。協(xié)作代理根據(jù)其種類,在適當(dāng)?shù)臅r(shí)候向RealSubject轉(zhuǎn)發(fā)請求。119publicclassForumPermissionsimplementsCacheablepublicclassForumProxyimplementsForumpublicclassDbForumimplementsForum,Cacheable120設(shè)計(jì)模式行為模式算法和對象間職責(zé)的分配。不僅描述了對象或類的模式,還描述它們之間的通信模式??坍嬃嗽谶\(yùn)行時(shí)難以跟蹤的復(fù)雜的控制流。121ChainofResponsibility–職責(zé)鏈很多對象由每一個(gè)對象對其下家的引用而接起來形成一條鏈。請求在這個(gè)鏈上傳遞,直到鏈上的某一個(gè)對象決定處理此請求??蛻舨⒉恢梨溕系哪囊粋€(gè)對象最終處理這個(gè)請求,系統(tǒng)可以在不影響客戶端的情況下動態(tài)的重新組織鏈和分配責(zé)任。處理者有兩個(gè)選擇:承擔(dān)責(zé)任或者把責(zé)任推給下家。一個(gè)請求可以最終不被任何接收端對象所接受。122123ChainofResponsibility–職責(zé)鏈參與者Handler定義一個(gè)處理請求的接口實(shí)現(xiàn)后繼鏈ConcreteHandle處理它所負(fù)責(zé)的請求可訪問它的后繼者如果可處理該請求,就處理之;否則將該請求轉(zhuǎn)發(fā)給它的后繼者。Client向鏈上的具體處理者對象提交請求協(xié)作當(dāng)客戶提交一個(gè)請求時(shí),請求沿鏈傳遞直至有一個(gè)ConcreteHandle對象負(fù)責(zé)處理它。124publicinterfaceHandler{

publicvoidhandleRequest(Requestrequest);}

publicclassRequest{

privateStringtype;

publicRequest(String

type){this.type=type;}

publicStringgetType(){returntype;}

publicvoidexecute(){

//request真正具體行為代碼

}}publicclassConcreteHandlerimplementsHandler{

privateHandlersuccessor;

publicConcreteHandler(Handlersuccessor){

this.successor=successor;

}

publicvoidhandleRequest(Requestrequest){

if(requestinstanceof

HelpRequest){

//這里是處理Help的具體代碼

}elseif(requestinstanceof

PrintRequst){

request.execute();

}else{

//傳送到下一個(gè)

successor.handle(request); } }}125COMMAND-命令模式

命令模式把一個(gè)請求或者操作封裝到一個(gè)對象中。命令模式把發(fā)出命令的責(zé)任和執(zhí)行命令的責(zé)任分割開,委派給不同的對象。命令模式允許請求的一方和發(fā)送的一方獨(dú)立開來,使得請求的一方不必知道接收請求的一方的接口,更不必知道請求是怎么被接收,以及操作是否執(zhí)行,何時(shí)被執(zhí)行以及是怎么被執(zhí)行的。系統(tǒng)支持命令的撤消。126127COMMAND-命令模式

參與者Command聲明執(zhí)行操作的接口ConcreteCommand將一個(gè)接收者對象綁定與一個(gè)動作調(diào)用接收者相應(yīng)的操作,以實(shí)現(xiàn)ExecuteClient創(chuàng)建一個(gè)具體命令對象并設(shè)定它的接收者Invoker要求該命令執(zhí)行這個(gè)請求Receiver知道如何實(shí)施與執(zhí)行一個(gè)請求相關(guān)的操作。任何類都可能作為一個(gè)接收者。128COMMAND-命令模式

協(xié)作Client創(chuàng)建一個(gè)ConcreteCommand對象并指定它的Receiver對象。某Invoker對象存儲該ConcreteCommand對象該Invoker通過調(diào)用Command對象的Execute操作來提交一個(gè)請求。若該命令是可撤銷的,ConcreteCommand就在執(zhí)行Execute操作之前存儲當(dāng)前狀態(tài)以用于取消命令。ConcreteCommand對象對調(diào)用它的Receiver的一些操作以執(zhí)行該請求。129publicinterfaceCommand{

publicabstractvoidexecute();}publicclassproducer{

publicstaticListproduceRequests(){

Listqueue=newArrayList();

queue.add(newDomesticEngineer());

queue.add(newPolitician());

queue.add(newProgrammer());

returnqueue;

}}publicclassTestCommand{

publicstaticvoidmain(String[]args){

Listqueue=PduceRequests();

for(Iteratorit=queue.iterator();it.hasNext();) //取出List中的內(nèi)容,其他特征不能確定,只能保證一個(gè)特征是100%正確,

//他們至少是界面Command的“兒子”。所以強(qiáng)制轉(zhuǎn)換類型為Command

((Command)it.next()).execute();

}}130INTERPRETER-解釋器模式給定一個(gè)語言后,解釋器模式可以定義出其文法的一種表示,并同時(shí)提供一個(gè)解釋器??蛻舳丝梢允褂眠@個(gè)解釋器來解釋這個(gè)語言中的句子。解釋器模式將描述怎樣在有了一個(gè)簡單的文法后,使用模式設(shè)計(jì)解釋這些語句。在解釋器模式里面提到的語言是指任何解釋器對象能夠解釋的任何組合。在解釋器模式中需要定義一個(gè)代表文法的命令類的等級結(jié)構(gòu),也就是一系列的組合規(guī)則。每一個(gè)命令對象都有一個(gè)解釋方法,代表對命令對象的解釋。命令對象的等級結(jié)構(gòu)中的對象的任何排列組合都是一個(gè)語言。131132INTERPRETER-解釋器模式參與者AbstractExpression聲明一個(gè)抽象的解釋操作,這個(gè)接口為抽象語法樹種所有的節(jié)點(diǎn)所共享。TerminalExpression實(shí)現(xiàn)與文法中的終結(jié)符相關(guān)聯(lián)的解釋操作一個(gè)句子中的每個(gè)終結(jié)符需要該類的一個(gè)實(shí)例NonterminalExpression非終結(jié)符表達(dá)式Context包含解釋其之外的一些全局信息Client構(gòu)建表示該文法定義的語言中一個(gè)特定的句子的抽象語法樹調(diào)用解釋操作133INTERPRETER-解釋器模式協(xié)作Client構(gòu)建(或被給定)一個(gè)句子,它是NonterminalExpression和TerminalExpression的實(shí)例的一個(gè)抽象語法樹。然后初始化上下文并調(diào)用解釋操作。每一非終結(jié)符表達(dá)式節(jié)點(diǎn)定義相應(yīng)子表達(dá)的解釋操作。而各終結(jié)符表達(dá)式的解釋操作構(gòu)成了遞歸的基礎(chǔ)。每一節(jié)點(diǎn)的解釋操作用上下文來存儲和訪問解釋器的狀態(tài)。134ITERATOR-迭代子模式迭代子模式可以順序訪問一個(gè)聚集中的元素而不必暴露聚集的內(nèi)部表象。多個(gè)對象聚在一起形成的總體稱之為聚集,聚集對象是能夠包容一組對象的容器對象。迭代子模式將迭代邏輯封裝到一個(gè)獨(dú)立的子對象中,從而與聚集本身隔開。迭代子模式簡化了聚集的界面。每一個(gè)聚集對象都可以有一個(gè)或一個(gè)以上的迭代子對象,每一個(gè)迭代子的迭代狀態(tài)可以是彼此獨(dú)立的。迭代算法可以獨(dú)立于聚集角色變化。135136ITERATOR-迭代子模式參與者Iterator——迭代器定義訪問和遍歷元素的接口。ConcreteIterator具體迭代器實(shí)現(xiàn)迭代器接口對該聚合遍歷時(shí)跟蹤當(dāng)前位置Aggregate——聚合定義創(chuàng)建相應(yīng)迭代器對象的接口ConcreteAggregate具體聚合實(shí)現(xiàn)創(chuàng)建相應(yīng)迭代器的接口,該操作返回ConcreteIterator的一個(gè)適當(dāng)?shù)膶?shí)例。協(xié)作ConcreteIterator跟蹤聚合中的當(dāng)前對象,并能夠計(jì)算出待遍歷的后繼對象137遍歷Collection中內(nèi)容publicclassTestCommand{

publicstaticvoidmain(String[]args){

Listqueue=PduceRequests();

for(Iteratorit=queue.iterator();it.hasNext();)

((Command)it.next()).execute();

}}138MEDIATOR-調(diào)停者模式調(diào)停者模式包裝了一系列對象相互作用的方式,使得這些對象不必相互明顯作用。從而使他們可以松散偶合。當(dāng)某些對象之間的作用發(fā)生改變時(shí),不會立即影響其他的一些對象之間的作用。保證這些作用可以彼此獨(dú)立的變化。調(diào)停者模式將多對多的相互作用轉(zhuǎn)化為一對多的相互作用。調(diào)停者模式將對象的行為和協(xié)作抽象化,把對象在小尺度的行為上與其他對象的相互作用分開處理。架構(gòu)級模式,F(xiàn)a?ade解決子系統(tǒng)間的問題,Mediator解決子系統(tǒng)內(nèi)(對象間)復(fù)雜問題。139140MEDIATOR-調(diào)停者模式參與者M(jìn)ediator中介者定義一個(gè)接口用于與各同事對象通信。ConcreteMediator具體中介者通過協(xié)調(diào)各同事對象實(shí)現(xiàn)協(xié)作行為了解并維護(hù)它的各個(gè)同事Colleagueclass每一個(gè)同事類都知道它的中介者對象每一個(gè)同事對象在需與其他的同時(shí)通信的時(shí)候,與它的中介者通信協(xié)作同事向一個(gè)中介對象發(fā)送和接收請求。中介者在各同事間適當(dāng)?shù)剞D(zhuǎn)發(fā)請求以實(shí)現(xiàn)協(xié)作行為141publicinterfaceMediator{}publicclassConcreteMediatorimplementsMediator{

//假設(shè)當(dāng)前有兩個(gè)成員

privateConcreteColleague1colleague1=newConcreteColleague1();

privateConcreteColleague2colleague2=newConcreteColleague2();

...}

publicclassColleague{

privateMediatormediator;

publicMediatorgetMediator(){

returnmediator; }

publicvoidsetMediator(Mediatormediator){

this.mediator=mediator; }}publicclassConcreteColleague1{}publicclassConcreteColleague2{}142MEMENTO-備忘錄模式備忘錄對象是一個(gè)用來存儲另外一個(gè)對象內(nèi)部狀態(tài)的快照的對象。備忘錄模式的用意是在不破壞封裝的條件下,將一個(gè)對象的狀態(tài)捉住,并外部化,存儲起來,從而可以在將來合適的時(shí)候把這個(gè)對象還原到存儲起來的狀態(tài)。143144MEMENTO-備忘錄模式參與者M(jìn)emento備忘錄存儲原發(fā)器對象的內(nèi)部狀態(tài)。原發(fā)器根據(jù)需要決定備忘錄存儲原發(fā)器的哪些內(nèi)部狀態(tài)。防止原發(fā)器以外的其他對象訪問備忘錄。Originator原發(fā)器創(chuàng)建一個(gè)備忘錄,用以記錄當(dāng)前時(shí)刻它的內(nèi)部狀態(tài)。使用備忘錄恢復(fù)內(nèi)部狀態(tài)Caretaker負(fù)責(zé)保存好備忘錄不能對備忘錄的內(nèi)容進(jìn)行操作或檢查協(xié)作管理器向原發(fā)器請求一個(gè)備忘錄,保留一段時(shí)間后,將其送回給原發(fā)器。145publicclassOriginator{ privateintnumber; privateFilefile=null;

publicOriginator(){}

//創(chuàng)建一個(gè)Memento publicMementogetMemento(){

returnnewMemento(this); }

//恢復(fù)到原始值

publicvoidsetMemento(Mementom){

number=m.number;

file=m.file; }}privateclassMementoimplementsjava.io.Serializable{

privateintnumber;

privateFilefile=null;

publicMemento(Originatoro){

number=o.number;

file=o.file;

}}146OBSERVER-觀察者模式觀察者模式定義了一種一對多的依賴關(guān)系,讓多個(gè)觀察者對象同時(shí)監(jiān)聽某一個(gè)主題對象。這個(gè)主題對象在狀態(tài)上發(fā)生變化時(shí),會通知所有觀察者對象,使他們能夠自動更新自己。147148OBSERVER-觀察者模式參與者Subject(目標(biāo))目標(biāo)知道它的觀察者??梢杂腥我舛鄠€(gè)觀察者觀察同一個(gè)目標(biāo)。提供注冊和刪除觀察者對象的接口。Observer(觀察者)為那些在目標(biāo)發(fā)生改變時(shí)需獲得通知的對象定義一個(gè)更新接口。ConcreteSubject

(具體目標(biāo))將有關(guān)狀態(tài)存入各ConcreteObserver對象當(dāng)它的狀態(tài)發(fā)生改變時(shí),向它的各個(gè)觀察者發(fā)出通知ConcreteObserver

(具體觀察者)維護(hù)一個(gè)指向ConcreteSubject

對象的引用存儲有關(guān)狀態(tài),這些狀態(tài)應(yīng)與目標(biāo)的狀態(tài)保持一致實(shí)現(xiàn)Observer的更新接口以使自身狀態(tài)與目標(biāo)的狀態(tài)保持一致149OBSERVER-觀察者模式協(xié)作當(dāng)ConcreteSubject

發(fā)生任何可能導(dǎo)致其觀察者與其本省狀態(tài)不一致的改變時(shí),它將通知它的各個(gè)觀察者在得到一個(gè)具體目標(biāo)的改變通知后,ConcreteObserver對象可向目標(biāo)對象查詢信息。ConcreteObserver使用這些信息以使它的狀態(tài)與目標(biāo)對象的狀態(tài)一致。150publicclassproductextendsObservable{ privateStringname;

privatefloatprice;

publicStringgetName(){returnname;}

publicvoidsetName(){

=name;

//設(shè)置變化點(diǎn)

setChanged();

notifyObservers(name); }

}publicclassNameObserverimplementsObserver{

privateStringname=null;

publicvoidupdate(Observable

obj,Object

arg){

if(arg

instanceofString){

name=(String)arg;

//產(chǎn)品名稱改變值在name中

System.out.println("NameObserver:namechangetto"+name);

}

}}151STATE-狀態(tài)模式狀態(tài)模式允許一個(gè)對象在其內(nèi)部狀態(tài)改變的時(shí)候改變行為。這個(gè)對象看上去象是改變了它的類一樣。狀態(tài)模式把所研究的對象的行為包裝在不同的狀態(tài)對象里,每一個(gè)狀態(tài)對象都屬于一個(gè)抽象狀態(tài)類的一個(gè)子類。狀態(tài)模式的意圖是讓一個(gè)對象在其內(nèi)部狀態(tài)改變的時(shí)候,其行為也隨之改變。狀態(tài)模式需要對每一個(gè)系統(tǒng)可能取得的狀態(tài)創(chuàng)立一個(gè)狀態(tài)類的子類。當(dāng)系統(tǒng)的狀態(tài)變化時(shí),系統(tǒng)便改變所選的子類。管理類在不同狀態(tài)下的行為。152153STATE-狀態(tài)模式參與者Context定義客戶感興趣的接口維護(hù)一個(gè)ConcreteState子類的實(shí)例State定義一個(gè)接口以封裝與Context的一個(gè)特定狀態(tài)相關(guān)的行為ConcreteStatesubclasses每一子類實(shí)現(xiàn)一個(gè)與Context的一個(gè)狀態(tài)相關(guān)的行為154STATE-狀態(tài)模式協(xié)作Context將與狀態(tài)相關(guān)的請求委托給當(dāng)前的ConcreteState

對象處理Context可將自身作為一個(gè)參數(shù)傳遞給處理該請求的狀態(tài)對象。這使得狀態(tài)對象在必要的時(shí)候可訪問Context。Context是客戶使用的主要接口Context或ConcreteState子類都可決定哪個(gè)狀態(tài)是另一個(gè)的后繼者,以及是在何種條件下進(jìn)行狀態(tài)裝換。155publicclassBlueStateextendsState{ publicvoidhandlepush(Contextc){

//根據(jù)push方法“如果是blue狀態(tài)的切換到green”;

c.setState(new

GreenState());

}

publicvoidhandlepull(Contextc){

//根據(jù)pull方法“如果是blue狀態(tài)的切換到red”;

c.setState(new

RedState()); }

publicabstractvoidgetcolor(){return(Color.blue);}}publicclassContext{ privateSatestate=null;//將原來的Colorstate改成了新建的Statestate; //setState是用來改變state的狀態(tài),使用setState實(shí)現(xiàn)狀態(tài)切換

pulicvoidsetState(Statestate){

this.state=state; } publicvoidpush(){

//狀態(tài)切換細(xì)節(jié),本例是顏色變化,封裝在子類handlepush中,此處無需關(guān)心

state.handlepush(this);

//因?yàn)閟ample要使用state中的一個(gè)切換結(jié)果,使用getColor()

Samplesample=newSample(state.getColor());

sample.operate(); } publicvoidpull(){

state.handlepull(this);

Sample2sample2=newSample2(state.getColor());

sample2.operate();

}}156STRATEGY-策略模式策略模式針對一組算法,將每一個(gè)算法封裝到具有共同接口的獨(dú)立的類中,從而使得它們可以相互替換。策略模式使得算法可以在不影響到客戶端的情況下發(fā)生變化。策略模式把行為和環(huán)境分開。環(huán)境類負(fù)責(zé)維持和查詢行為類,各種算法在具體的策略類中提供。由于算法和環(huán)境獨(dú)立開來,算法的增減,修改都不會影響到環(huán)境和客戶端。與State較象,類中封裝

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論