




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、2/182很多系統(tǒng)的解決方案都比較類似很多系統(tǒng)的解決方案都比較類似解決方案的共同點是什么?區(qū)別在何處?用到哪些特殊的方法?如何制定一個特殊的方法?3/182表示軟件系統(tǒng)的基本結構化組織圖式。提供一個用于細化軟件系統(tǒng)的子系統(tǒng)或組件,或它們之間關系的圖式。4/182體系結構模式體系結構模式可作為具體軟件體系結構的模版。它們規(guī)定一個應用的系統(tǒng)范圍的結構特性,以及對其子系統(tǒng)的體系結構施加的影響。體系結構模式的選擇是開發(fā)一個軟件系統(tǒng)時的基本設計決策。5/182設計模式設計模式軟件體系結構的子系統(tǒng),以及它們之間的關系。通常 由幾個更小的體系結構單元構成。中等規(guī)模的模式。規(guī)模上比體系結構模式小,但又獨立于特
2、定編程語言。設計模式的應用對軟件系統(tǒng)的基礎結構沒有影響,但可能對子系統(tǒng)的體系結構有所影響。提供分解更復雜的服務或組件的結構,以及它們之間的合作。6/182慣用法慣用法處理特定設計問題的實現代表最低層模式,關注設計和實現方面針對具體語言,捕獲現有的編程經驗7/182一個模式關注一個在特定設計環(huán)境中出現的設計一個模式關注一個在特定設計環(huán)境中出現的設計問題,并為它提供一個解決方案。問題,并為它提供一個解決方案。各種模式用文檔記錄下現存的經過充分考驗的設各種模式用文檔記錄下現存的經過充分考驗的設計經驗。計經驗。模式為設計原則提供一種公共的詞匯和理解。模式為設計原則提供一種公共的詞匯和理解。模式是為軟件
3、體系結構建立文檔的一種手段。模式是為軟件體系結構建立文檔的一種手段。模式支持用已定義的屬性來構造軟件。模式支持用已定義的屬性來構造軟件。8/182語境:問題出現的場景語境:問題出現的場景問題:在那個語境中出現的再現問題問題:在那個語境中出現的再現問題解決方案必須滿足的需求必須考慮的約束解決方案必須具有的特性解決方案:已被證實的問題的解決方案解決方案:已被證實的問題的解決方案特定的結構:組件和關系的結構運行期的行為9/182模式的圖式:模式的圖式:10/182 架構模式架構模式 設計模式設計模式 物理體系結構建模物理體系結構建模11/182 架構模式架構模式 設計模式設計模式 物理體系結構建模物
4、理體系結構建模12/182一個軟件體系結構的模式描述了一個出一個軟件體系結構的模式描述了一個出現在特定設計語境中的特殊的再現設計現在特定設計語境中的特殊的再現設計問題,并為它的解決方案提供了一個經問題,并為它的解決方案提供了一個經過充分驗證的通用圖式。過充分驗證的通用圖式。一組預先確定的子系統(tǒng)和他們的職責子系統(tǒng)間的相互關聯的規(guī)則例如: Model-View-Controller模式13/18214/182層體系結構模式有助于構建這樣的應用:層體系結構模式有助于構建這樣的應用: 它能被分解成子任務組,其中每個子任務組它能被分解成子任務組,其中每個子任務組處于一個特定的抽象層次上。處于一個特定的抽
5、象層次上。下層為上層提供服務上層利用下層提供的服務完成自身的任務通過同步程序調用來完成請求的服務15/18216/182一個獨立層的描述一個獨立層的描述17/182舉例:虛擬機舉例:虛擬機e.g. JVM舉例:舉例: APIse.g. C standard library, built on Unix system calls舉例:信息系統(tǒng)舉例:信息系統(tǒng)應用層數據庫表示層應用邏輯層領域層數據庫18/182舉例:舉例:Windows NT系統(tǒng)服務:子系統(tǒng)和NT執(zhí)行程序之間的接口層資源管理器層:包含對象管理器、安全引用監(jiān)視器、過程管理器、I/O管理器、虛擬存儲管理器和局部過程調用等模塊。內核:它關
6、心一些基本功能,如中斷和意外處理、多處理器同步、線程調度和現程分配。硬件抽象層(HAL):隱藏了不同處理器系列機器之間的硬件差異。硬件19/18220/182優(yōu)點:優(yōu)點:層的重用標準化支持局部性依賴可替換性不足不足更改行為的重疊降低效率不必要的工作難以認可層的正確粒度21/18222/182將一個交互式應用程序分為三個組件。將一個交互式應用程序分為三個組件。模型模型(Model):核心功能和數據:核心功能和數據視圖視圖(Views):向用戶顯示信息:向用戶顯示信息控制器控制器(Controllers):處理用戶輸入:處理用戶輸入視圖和控制器共同構成了用戶接口視圖和控制器共同構成了用戶接口變更變
7、更-傳播機制確保了用戶接口和模型之間的一致性傳播機制確保了用戶接口和模型之間的一致性23/18224/18225/182相同的信息在不同的窗口有不同的表示相同的信息在不同的窗口有不同的表示支持不同的支持不同的“樣式和感覺樣式和感覺”標準標準模型獨立于表示模型獨立于表示布告形式連接布告形式連接觀察者設計模式舉例:舉例:SmalltalkASP.NET .aspx:視圖:視圖 .VB,.C#:控制:控制26/18227/182服務器端為客戶端提供服務服務器端為客戶端提供服務客戶端從服務器端請求服務客戶端從服務器端請求服務服務器一直保持監(jiān)聽請求的狀態(tài)服務器一直保持監(jiān)聽請求的狀態(tài)舉例:舉例:遠程數據庫
8、連接遠程文件系統(tǒng)多層信息系統(tǒng)Web 應用28/18229/182支持容錯性、并行計算以及計算準確性。支持容錯性、并行計算以及計算準確性。主控組件將工作分配給相同的從屬組件,并主控組件將工作分配給相同的從屬組件,并從從屬組件返回的結果中計算最終的結果。從從屬組件返回的結果中計算最終的結果。舉例:舉例:嵌入式系統(tǒng)大規(guī)模并行計算容錯系統(tǒng)30/18231/18232/182主控模塊故障,整個系統(tǒng)故障主控模塊故障,整個系統(tǒng)故障主控模塊將任務劃分為幾個同等的子任務主控模塊將任務劃分為幾個同等的子任務從屬之間相互獨立從屬之間相互獨立從屬之間并行工作從屬之間并行工作問題是可以分解的問題是可以分解的應用領域:應
9、用領域:容錯并行計算計算準確性33/182優(yōu)點:優(yōu)點:可互換性和可擴充性事務分離效率不足:不足:可行性對機器依賴性難以實現可移植性34/18235/182管道和過濾器體系結構模式,為處理數據流的系統(tǒng)提供管道和過濾器體系結構模式,為處理數據流的系統(tǒng)提供了一種結構了一種結構每個處理步驟封裝在一個過濾器組件中每個處理步驟封裝在一個過濾器組件中數據通過相鄰過濾器之間的管道傳輸數據通過相鄰過濾器之間的管道傳輸管道處理緩沖和同步重組過濾器可以建立相關系統(tǒng)族重組過濾器可以建立相關系統(tǒng)族舉例:舉例:編譯器Unix 內核命令36/18237/18238/182優(yōu)點:優(yōu)點:通過過濾器交換增加了靈活性通過重組增加了
10、靈活性過濾器組件的重用并行處理提高效率不足:不足:共享狀態(tài)信息或者昂貴或者不靈活并行處理獲得的效率往往只一種假象數據轉換額外開銷錯誤處理39/18240/182代理者結構模式可以用于構建帶有隔離組件的分布式代理者結構模式可以用于構建帶有隔離組件的分布式軟件系統(tǒng),該軟件通過遠程服務調用進行交互。軟件系統(tǒng),該軟件通過遠程服務調用進行交互。代理者組件負責協(xié)調通信代理者組件負責協(xié)調通信轉發(fā)請求、傳送結果和異常服務器將他們的服務(屬性和操作)發(fā)布給一個代理服務器將他們的服務(屬性和操作)發(fā)布給一個代理客戶端通過一個代理請求服務器處理客戶端通過一個代理請求服務器處理代理將請求發(fā)送給一個合適的服務器處理代理
11、將請求發(fā)送給一個合適的服務器處理41/182允許動態(tài)改變、添加、刪除和重新發(fā)布允許動態(tài)改變、添加、刪除和重新發(fā)布對于開發(fā)者來說,代理是透明的對于開發(fā)者來說,代理是透明的請求需要有標準的表示法請求需要有標準的表示法當兩個代理者互操作時,實現細節(jié)可通過網橋來隱藏當兩個代理者互操作時,實現細節(jié)可通過網橋來隱藏舉例:舉例:公共對象請求代理體系結構(CORBA),處理異構系統(tǒng)上分布式對象的面向對象技術Web services42/18243/18244/182對稱的對稱的 客戶機客戶機-服務器模式服務器模式客戶機向服務器請求服務服務器通知客戶機特定的事件任何一個節(jié)點都可以扮演客戶機或者服務器的角色可以動
12、態(tài)的交換角色舉例:舉例:多用戶應用P2P 技術45/18246/182事件源將消息發(fā)布到總線上的特殊通道上事件源將消息發(fā)布到總線上的特殊通道上事件監(jiān)聽者訂閱通道上的消息事件監(jiān)聽者訂閱通道上的消息監(jiān)聽者監(jiān)聽有效消息監(jiān)聽者監(jiān)聽有效消息消息是異步的消息是異步的通路可以是固定的通路可以是固定的47/18248/182黑板體系結構模式對于無確定性求解策略的問題比較有用。黑板體系結構模式對于無確定性求解策略的問題比較有用。黑板模式中,有幾個專用子系統(tǒng)收集其知識,以建立一個可能的部分解或近似解。舉例: 語音識別所有組件共享數據存儲(黑板)所有組件共享數據存儲(黑板)組件生成新的數據更新到黑板組件生成新的數據
13、更新到黑板組件監(jiān)視黑板上的數據組件監(jiān)視黑板上的數據利用匹配模式尋找特定的數據49/18250/18251/182優(yōu)點:優(yōu)點:對可更改性和可維護性的支持可重用的知識源支持容錯性和健壯性不足:不足:測試困難不能保證有好的求解方案難以建立一個好的控制策略低效昂貴的開發(fā)工作缺少對并行機制的支持52/182 架構模式架構模式 設計模式設計模式 物理體系結構建模物理體系結構建模53/182 Abstract factory(抽象工廠) 提供一個創(chuàng)建一系列相關或相互依賴對象的接口,提供一個創(chuàng)建一系列相關或相互依賴對象的接口,而無需制定它們具體的類。而無需制定它們具體的類。 Adapter(適配器) 將一個類
14、的接口轉換成客戶希望的另一個接口。它將一個類的接口轉換成客戶希望的另一個接口。它使得原本由于接口不兼容而不能在一起工作的那些使得原本由于接口不兼容而不能在一起工作的那些類可以在一起工作。類可以在一起工作。 Bridge (橋接) 將抽象部分與它的實現部分分離,使它們都可以獨將抽象部分與它的實現部分分離,使它們都可以獨立的變化。立的變化。54/182 Builder(生成器) 將一個復雜對象的構建與它的表示分離,使得同樣的構建過將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創(chuàng)建不同的表示。程可以創(chuàng)建不同的表示。 Chain of Responsibility(職責鏈) 為解除請求的發(fā)
15、送者和接受者之間的耦合,而使多個對象都為解除請求的發(fā)送者和接受者之間的耦合,而使多個對象都有機會處理這個請求。將這些對象連成一條鏈,并沿著這個有機會處理這個請求。將這些對象連成一條鏈,并沿著這個鏈傳遞該請求,直到有一個對象處理它。鏈傳遞該請求,直到有一個對象處理它。 Command (命令) 將一個請求封裝成一個對象,從而使你可用不同的請求對客將一個請求封裝成一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日志,以及支持可取戶進行參數化;對請求排隊或記錄請求日志,以及支持可取消的操作。消的操作。55/182 Composite(組成) 將對象組合成樹型結構以表示將對象組合
16、成樹型結構以表示“部分部分-整體整體”的層次結構。它使的層次結構。它使得客戶對單個對象和復合對象的使用具有一致性。得客戶對單個對象和復合對象的使用具有一致性。 Decorator(裝飾) 動態(tài)的給一個對象添加一些額外的職責。就擴展功能而言,該動態(tài)的給一個對象添加一些額外的職責。就擴展功能而言,該模式比生成子類的方式更為靈活。模式比生成子類的方式更為靈活。 Facade (外觀) 為子系統(tǒng)中的一組接口提供一個已知的界面,該模式定義了一為子系統(tǒng)中的一組接口提供一個已知的界面,該模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。56/182
17、Factory Method(工廠方法) 定義一個用于創(chuàng)建對象的接口,讓子類決定將哪一個類定義一個用于創(chuàng)建對象的接口,讓子類決定將哪一個類實例化。它使得一個類的實例化延遲到其子類。實例化。它使得一個類的實例化延遲到其子類。 Flyweight(享元) 運用共享技術有效地支持大量細粒度的對象。運用共享技術有效地支持大量細粒度的對象。 Interpreter (解釋器) 給定一個語言,定義它的文法的一種表示,并定義一個給定一個語言,定義它的文法的一種表示,并定義一個解釋器,該解釋器使用該表示來解釋語言中的句子。解釋器,該解釋器使用該表示來解釋語言中的句子。57/182 Iterator(迭代器)
18、提供一種方法順序訪問一個聚合對象中的各個元素,而又不需提供一種方法順序訪問一個聚合對象中的各個元素,而又不需暴露該對象的內部表示。暴露該對象的內部表示。 Mediator(中介者) 用一個中介對象來封裝一些列的對象交互。中介者使各對象不用一個中介對象來封裝一些列的對象交互。中介者使各對象不需要顯示地相互引用,從而使其耦合松散,而且可以獨立地改需要顯示地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。變它們之間的交互。 Memento (備忘錄) 在不破壞封裝性的前提下,捕獲一個對象的內部狀態(tài),并在該在不破壞封裝性的前提下,捕獲一個對象的內部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣以
19、后就可將該對象恢復到保存的對象之外保存這個狀態(tài)。這樣以后就可將該對象恢復到保存的狀態(tài)。狀態(tài)。58/182 Observer(觀察者) 定義對象間的一種一對多的依賴關系,以便當一個對象定義對象間的一種一對多的依賴關系,以便當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并自動刷新。自動刷新。 Prototype(原型) 用原型實例制定創(chuàng)建對象的種類,并通過拷貝這個原型用原型實例制定創(chuàng)建對象的種類,并通過拷貝這個原型來創(chuàng)建新的對象。來創(chuàng)建新的對象。 Proxy (代理) 為其他對象提供一個代理以控制對這個對象的訪問。為其他對象提供一個代理以控
20、制對這個對象的訪問。59/182 Singleton(單件) 保證一個類僅有一個實例,并提供一個訪問它的全局訪保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。問點。 State(狀態(tài)) 允許一個對象在其內部狀態(tài)改變時改變它的行為。對象允許一個對象在其內部狀態(tài)改變時改變它的行為。對象看起來似乎修改了他所屬的類。看起來似乎修改了他所屬的類。 Strategy (策略) 定義一系列算法,把它們一個個封裝起來,并且使它們定義一系列算法,把它們一個個封裝起來,并且使它們可相互替換。本模式使得算法的變化可獨立于使用它的可相互替換。本模式使得算法的變化可獨立于使用它的客戶??蛻簟?0/182 Temp
21、late Method(模版方法) 定義一個操作中的算法的骨架,而將一些步驟延遲到子定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。該模式使得子類可以不改變一個算法的結構即可類中。該模式使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。重定義該算法的某些特定步驟。 Visitor(訪問者) 表示一個作用于某對象結構中的各元素的操作。它使你表示一個作用于某對象結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素可以在不改變各元素的類的前提下定義作用于這些元素的新操作。的新操作。61/182目的目的創(chuàng)建型創(chuàng)建型結構型結構型行為型行為型范范圍圍類類 Fac
22、tory MethodAdapter(類類)InterpreterTemplate Method對對象象Abstract FactoryBuilderPrototypeSingletonAdapter(對象對象)BridgeCompositeDecoratorFaadeFlyweightProxyChain of ResponsibilityCommandIteratorMediatorMementoObserverStateStrategyVisitor62/182 優(yōu)點 面向接口編程面向接口編程 創(chuàng)建型模式確保系統(tǒng)是采用針對接口的方式書寫的,而不是針對實現而書寫的。 降低耦合性降低耦合性
23、增加靈活性增加靈活性63/182 創(chuàng)建型模式 將系統(tǒng)使用哪些具體的類的信息封裝起來將系統(tǒng)使用哪些具體的類的信息封裝起來 隱藏了這些類的實例是如何被創(chuàng)建和放在一隱藏了這些類的實例是如何被創(chuàng)建和放在一起的起的64/182 客戶類和工廠類分開??蛻羧魏螘r候需要某種產品,只需向工廠請求即可??蛻魺o須修改就可以接納新產品。 缺點是當產品修改時,工廠類也要做相應的修改。65/18266/18267/18268/18269/18270/182 意圖 定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。 Factory Method 使一個類的實例化延遲
24、到其子類。使一個類的實例化延遲到其子類。 適用性:適用性: 當一個類不知道它所必須創(chuàng)建的對象的類的時候; 當一個類希望由它的子類來指定它所創(chuàng)建的對象的時候 當類將創(chuàng)建對象的職責委托給多個幫助子類的某一個,并且你希望將哪一個幫助子類是代理者這一信息局部化的時候71/182 結構參與者 Product定義工廠方法所創(chuàng)建的對象的接口 ConcreteProduct實現Product接口 Creator聲明工廠方法,該方法返回一個聲明工廠方法,該方法返回一個Product類型的對象。類型的對象??梢哉{用工廠方法以創(chuàng)建一個可以調用工廠方法以創(chuàng)建一個Product對象。對象。 ConcreteCreato
25、r重定義工廠方法以返回一個ConcreteProduct實例72/182 協(xié)作 Creator依賴于它的子類來定義工廠方法,所以它返回一個適當的ConcreteProduct實例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)建一系列相關或相互依賴對象的接口,提供一個創(chuàng)建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。而無需指定它們具體的類。 75/182 參與者 AbstractFactory聲明一個創(chuàng)建抽象產品對象的操作接口聲明一個創(chuàng)建抽象產品對象的操作接口 ConcreteFactory實現創(chuàng)建具體產品對象的操作實現創(chuàng)建具體產品對象的操作 AbstractProduct為一類產品對象聲明一個接口為一類產品對象聲明一個接口 ConcreteProduct 定義一個將被相應的具體工廠創(chuàng)建的產品對象 實現AbstractProduct接口 Client 僅使用由僅
27、使用由AbstractFactory和和AbstractProduct類聲明的接口類聲明的接口 協(xié)作 通常在運行時刻創(chuàng)建一個通常在運行時刻創(chuàng)建一個ConcreteFactory類的實例。這一具體類的實例。這一具體的工廠創(chuàng)建具有特定實現的產品對象。為創(chuàng)建不同的產品對象,的工廠創(chuàng)建具有特定實現的產品對象。為創(chuàng)建不同的產品對象,客戶應適用不同的具體工廠??蛻魬m用不同的具體工廠。 AbstractFactory將產品對象的創(chuàng)建延遲到它的將產品對象的創(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對象傳遞不同的參數,以返回對象傳遞不同的參數,以返回具有相同基類或實現了同一接口的對象具有相同基類或實現了同一接口的對象 Abstract Factory模式 先利用先利用Factory模式返回模式返回Factory對象,再通對象,再通過過Factory對象返回不同的對象對象返回不同的對象78/182 將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創(chuàng)建不同的表示。 建造模式可以強制實行一種分步驟進行的建造過程。 79/182 參與者: Builder為創(chuàng)建一
30、個為創(chuàng)建一個Product對象的各個部件制對象的各個部件制定抽象接口。定抽象接口。 ConcreteBuilder 實現Builder的接口以構造和裝配該產品的各個部件 定義并明確它所創(chuàng)建的表示 提供一個檢索產品的接口 Derector構造一個使用構造一個使用Builder接口的對象接口的對象 Product 表示被構造的復雜對象 包含定義組成部件的類80/182 協(xié)作: 客戶創(chuàng)建客戶創(chuàng)建Director對象,并用它所想要的對象,并用它所想要的Builder對對象進行配置象進行配置 一旦產品部件被生成,導向器就會通知生成器一旦產品部件被生成,導向器就會通知生成器 生成器處理導向器的請求,并將部
31、件添加到該產品生成器處理導向器的請求,并將部件添加到該產品中中 客戶從生成器中檢索產品客戶從生成器中檢索產品81/182public interface Builder /創(chuàng)建部件A:比如汽車車輪void buildPartA(); /創(chuàng)建部件B:比如方向盤void buildPartB(); /創(chuàng)建部件C:比如發(fā)動機void buildPartC(); /返回最終組裝產品成果 (返回最后裝配好的汽車)/成品的組裝過程不在這里進行,而是轉移到下面的Director中進行。/從而實現過程與部件的解耦。Product getResult(); public class Director priva
32、te Builder builder; public Director( Builder builder ) this.builder = builder; / 將partA, partB, partC最后組成復雜物件/汽車的組裝過程public void construct() builder.buildPartA();builder.buildPartB();builder.buildPartC(); 82/182意圖用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象。用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象。 其實是將product和factory功能合
33、二為一了。缺點是每一個類都必須配備一個克隆方法。適用性:當一個系統(tǒng)應該獨立于它的產品創(chuàng)建、構成和表示時,要使用當一個系統(tǒng)應該獨立于它的產品創(chuàng)建、構成和表示時,要使用Prototype模式;以及模式;以及當要實例化的類是在運行時刻指定時;或者當要實例化的類是在運行時刻指定時;或者為了避免創(chuàng)建一個與產品類層次平行的工廠類層次時;或者為了避免創(chuàng)建一個與產品類層次平行的工廠類層次時;或者當一個類的實例只能由幾個不同狀態(tài)組合中的一種時。建立相應數目的當一個類的實例只能由幾個不同狀態(tài)組合中的一種時。建立相應數目的原型并克隆它們可能比每次用合適的狀態(tài)手工實例化該類更方便一些。原型并克隆它們可能比每次用合適的
34、狀態(tài)手工實例化該類更方便一些。83/182參與者 Prototype聲明一個克隆自身的接口。聲明一個克隆自身的接口。 ConcretePrototype實現一個克隆自身的操作。實現一個克隆自身的操作。 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、時它時 當這個唯一實例應該是通過子類化可擴展的,并且客戶應該無需當這個唯一實例應該是通過子類化可擴展的,并且客戶應該無需更改代碼就能使用一個擴展的實例時。更改代碼就能使用一個擴展的實例時。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的接口??蛻纛愅ǔ2⒉恢谰唧w抽象類或抽象類實現的接口??蛻纛愅ǔ2⒉恢谰唧w類的確切類型。類的確切類型。 當系統(tǒng)演化依賴于對象的組合、聚集時,創(chuàng)建型模式帶當系統(tǒng)演化依賴于對象的組合、聚集時,創(chuàng)建型模式帶來了更大的靈活性。來了更大的靈活性。89/182 結構型模式 如何組合類和對象以獲得更大的結構如何組合類和對象以獲得更大的結構 類模型采用繼承機制來組合接口或實現,如采用多重繼承方法將兩個以上的類組合成一個類 對象模式不是對接口和實現進行組合,它描述
40、了如何對一些對象進行組合,從而實現新功能的一些方法。在運行時刻改變對象組合關系,具有更大的靈活性。90/182 把一個類的接口變換成客戶端所期待的另一種把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口原因不匹配而無法一接口,從而使原本因接口原因不匹配而無法一起工作的兩個類能夠一起工作。起工作的兩個類能夠一起工作。 適配類可以根據參數返還一個合適的實例給客適配類可以根據參數返還一個合適的實例給客戶端。戶端。91/18292/18293/182 參與者 Target定義定義Client使用的與特定另一相關的接口使用的與特定另一相關的接口 Client與符合與符合Target接口的對象
41、協(xié)同接口的對象協(xié)同 Adaptee定義一個已經存在的接口,這個接口需要適配定義一個已經存在的接口,這個接口需要適配 Adapter對對Adaptee的接口與的接口與Target接口進行適配接口進行適配 協(xié)作 Client在在Adapter實例上調用一些操作。接著適配器調用實例上調用一些操作。接著適配器調用Adaptee的操作實現這個請求。的操作實現這個請求。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;/ 構造方法 public PegAdapter(RoundPeg peg)this.roundPeg=peg; / 構造方法 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 將抽象部分與它的實現部分分離,使它們都可以獨立地變化。 解決2個方面的變化問題:抽象與實現。即一個類中多個方向的變化問題。 97/182 參與者參與者 Abstraction 定義抽象類的接口定義抽象類的接口 維護一個指向維護一個指向Implementor類型對象的指針類型對象的指針 RefinedAbstraction擴充由Abstraction定義的接口 Implementor定義實現類的接口,該接口不一定要與Abstraction的接口完全一致。 Co
44、ncreteImplementor實現Implementor接口并定義它的具體實現 協(xié)作協(xié)作 Abstraction將Client的請求轉發(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 合成模式把部分與整體關系用樹結構表示。 合成模式使得用戶對單個對象和組合對象的使用具有一致性。102/182103/182 參與者 Component 為組合中的對象聲明接口 在適當的情況下,實現所有類共有接口的缺省行為 聲明一個接口用于訪問和管理Component的子組件 (可選)在遞歸結構中定義一個接口,用于訪問一個父部件,并在合適的情況下實現它 Leaf 在組合中表示葉節(jié)點對象,葉節(jié)點沒有子節(jié)點 在組合中定義圖元對象的行為 Composite 定義有子部件的那些部件的行為 存儲子部件 在Component接口中實現與子部件有關的操作 Client 通過Component接口操
47、縱組合部件的對象104/182 協(xié)作 用戶使用用戶使用Component類接口與組合結構中的對類接口與組合結構中的對象進行交互。如果接收者是一個葉節(jié)點,則直象進行交互。如果接收者是一個葉節(jié)點,則直接處理請求。如果接收者是接處理請求。如果接收者是Composite,它通,它通常將請求發(fā)送給它的子部件,在轉發(fā)請求之前常將請求發(fā)送給它的子部件,在轉發(fā)請求之前與與/或之后,可能執(zhí)行一些輔助操作?;蛑螅赡軋?zhí)行一些輔助操作。105/182public abstract class Equipmentprivate String name; /網絡價格 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è)務操作),如加密、緩存、壓縮等,這些可能只是輔助主體業(yè)務的附著,并不嚴格按照維度變化。裝飾模式以對客戶端透明的方式擴展對象的功能,是繼承關系的一個替代方案,提供比繼承更多的靈活性。動態(tài)給一個對象增加功能,這些功能可以再動態(tài)的撤消
50、。增加由一些基本功能的排列組合而產生的非常大量的功能。既繼承又組合,實際上是將Bridge中的抽象和實現合二為一了,是其特殊形式。 107/182參與者Component定義一個對象接口,可以給這些對象動態(tài)地添加職責。定義一個對象接口,可以給這些對象動態(tài)地添加職責。ConcreteComponent定義一個對象,可以給這個對象添加一些職責。定義一個對象,可以給這個對象添加一些職責。Decorator維持一個指向維持一個指向Component對象的指針,并定義一個與對象的指針,并定義一個與 Component接口一致的接口接口一致的接口ConcreteDecorator向組件添加職責。向組件添加
51、職責。協(xié)作Decorator將請求轉發(fā)給它的將請求轉發(fā)給它的Component對象,并有可能在轉發(fā)請求前對象,并有可能在轉發(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(); /在構造器中使用組合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、適當的子系統(tǒng)對象將客戶的請求代理給適當的子系統(tǒng)對象Subsystem 實現子系統(tǒng)的功能實現子系統(tǒng)的功能 處理由處理由FacadeFacade對象指派的任務對象指派的任務 沒有沒有FacadeFacade的任何相關信息;即沒有指向的任何相關信息;即沒有指向FacadeFacade的指針的指針 協(xié)作協(xié)作客戶程序通過發(fā)送給Facade的方式與子系統(tǒng)通訊, Facade將這些消息轉發(fā)給適當的子系統(tǒng)對象。盡管是子系統(tǒng)中有關對象在做實際工作,但Facade模式本身也必須將它的接口轉換成子系統(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)建被共享的對象,而應當使用一個工廠對象負責創(chuàng)建被共享的對象。 享元模式大幅度的降低內存中對象的數量,主要解決OO性能問題。113/182114/182參與者Flyweight 描述一個接口,通過這個接口Flyweight可以接受并作用于外部狀態(tài)。ConcreteFlyweight 實現Flyweight接口,并為內部狀態(tài)(如果有的話)增加存儲空間。UnsharedConcreteFlyweight 并非所有的Flyweight子類都需要被共享。 Flyweight接口使共享成為可能,但它并不強制共享。在Flyweight對象結構的某些層次,
57、 UnsharedConcreteFlyweight對象通常將ConcreteFlyweight對象作為子節(jié)點。FlyweightFactory 創(chuàng)建并管理Flyweight對象 確保合理地共享Flyweight。Client 維持一個對Flyweight的引用 計算或存儲一個(多個) Flyweight的外部狀態(tài)115/182 協(xié)作 Flywelght執(zhí)行時所需的狀態(tài)必定是內部的或外部的。執(zhí)行時所需的狀態(tài)必定是內部的或外部的。內部狀態(tài)存儲于內部狀態(tài)存儲于ConcreteFlyweight對象之中;而外對象之中;而外部對象則由部對象則由Client對象存儲或計算。當用戶調用對象存儲或計算。當用
58、戶調用Flywelght對象的操作時,將該狀態(tài)傳遞給它。對象的操作時,將該狀態(tài)傳遞給它。 用戶不應直接對用戶不應直接對ConcreteFlyweight類進行實例話,類進行實例話,而只能從而只能從FlywelghtFactory對象得到對象得到ConcreteFlyweight對象,這可以保證對它們適當地對象,這可以保證對它們適當地進行共享。進行共享。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 /內部狀態(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);/產生新的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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 姨媽巾自助販賣機創(chuàng)業(yè)計劃
- 云南民族大學附中2025屆高三最后一?;瘜W試題含解析
- 學校食堂操作流程培訓
- 湖南省邵東市振華中學2024-2025學年高一下學期3月階段性檢測地理試題(含答案)
- 2025年江西省中考化學模擬預測卷(5)(含答案)
- 北京市師范大學附屬中學2025屆高三第三次模擬考試化學試卷含解析
- 2025年硅-鋁絲材項目發(fā)展計劃
- 吉林省長春市外國語學校2025屆高考化學全真模擬密押卷含解析
- 2025年實驗儀器裝置項目建議書
- 2025年茶及飲料原料項目建議書
- (一模)2025年廣東省高三高考模擬測試 (一) 英語試卷(含官方答案及詳解)
- 退役軍人無人機培訓宣傳
- 退役軍人保密教育
- DB44∕T 370-2006 東風螺養(yǎng)殖技術規(guī)范繁殖與苗種培育技術
- 7.1我國法治建設的歷程 課件高中政治統(tǒng)編版必修三政治與法治
- 2025年仲裁法考試試題及答案
- 2025年電梯修理作業(yè)證理論考試練習題(100題)含答案
- 交通運輸部南海航海保障中心推遲公開招聘筆試高頻重點模擬試卷提升(共500題附帶答案詳解)
- T-ZJWL 001-2024 大宗商品供應鏈金融動產質押監(jiān)管倉儲服務規(guī)范
- 交通運輸行業(yè)股權分配方案
- 中試平臺管理制度
評論
0/150
提交評論