面向對象方法與技術:設計模式實踐課件_第1頁
面向對象方法與技術:設計模式實踐課件_第2頁
面向對象方法與技術:設計模式實踐課件_第3頁
面向對象方法與技術:設計模式實踐課件_第4頁
面向對象方法與技術:設計模式實踐課件_第5頁
已閱讀5頁,還剩153頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

面向對象的技術與方法共151頁第2頁Composite(組合)模式目的:將對象組合成樹形結構以表示“部分-整體”的層次結構。Composite使得用戶對單個對象和組合對象的使用具有一致性。共151頁第3頁Composite(組合)模式動機:在繪圖編輯器和圖形捕捉系統這樣的圖形應用程序中,用戶可以使用簡單的組件創建復雜的圖表。用戶可以組合多個簡單組件以形成一些較大的組件,這些組件又可以組合成更大的組件。一個簡單的實現方法是為Text和Line這樣的圖元定義一些類,另外定義一些類作為這些圖元的容器類(Container)。共151頁第4頁Composite(組合)模式存在的問題:使用這些類的代碼必須區別對待圖元對象與容器對象,而實際上大多數情況下用戶認為它們是一樣的。對這些類區別使用,使得程序更加復雜。共151頁第5頁Composite(組合)模式

Composite模式描述了如何使用遞歸組合,使得用戶不必對這些類進行區別,如圖所示:共151頁第6頁Composite(組合)模式共151頁第7頁Composite(組合)模式

Picture類定義了一個Graphic

對象的聚合。Picture

的Draw操作是通過對它的子部件調用Draw實現的,Picture還用這種方法實現一些與其子部件相關的操作。由于Picture接口與Graphic接口是一致的,因此Picture對象可以遞歸地組合其他Picture對象。共151頁第8頁Composite(組合)模式

下圖是一個典型的由遞歸組合的Graphic對象組成的組合對象結構:共151頁第9頁Composite(組合)模式適用性你想表示對象的部分-整體層次結構。你希望用戶忽略組合對象與單個對象的不同,用戶將統一地使用組合結構中的所有對象。共151頁第10頁Composite(組合)模式結構共151頁第11頁Composite(組合)模式共151頁第12頁Composite(組合)模式協作用戶使用Component類接口與組合結構中的對象進行交互。如果接收者是一個葉節點,則直接處理請求。如果接收者是Composite,它通常將請求發送給它的子部件,在轉發請求之前與/或之后可能執行一些輔助操作。共151頁第13頁Composite(組合)模式效果定義了包含基本對象和組合對象的類層次結構。

簡化客戶代碼使得更容易增加新類型的組件使你的設計變得更加一般化共151頁第14頁Composite(組合)模式代碼示例計算機這樣的設備經常被組裝成部分-整體層次結構。例如,底盤可包含驅動裝置和平面板,總線含有多個插件,機柜包括底盤、總線等。共151頁第15頁Composite(組合)模式Equipment類為在部分-整體層次結構中的所有設備定義了一個接口。共151頁第16頁Composite(組合)模式共151頁第17頁Composite(組合)模式Equipment的子類包括表示磁盤驅動器、集成電路和開關的Leaf類:共151頁第18頁Composite(組合)模式CompositeEquipment是包含其他設備的基類,它也是Equipment的子類。共151頁第19頁Composite(組合)模式共151頁第20頁Composite(組合)模式NetPrice的缺省實現使用CreateIterator來累加子設備的實際價格。共151頁第21頁Composite(組合)模式我們將計算機的底盤表示為CompositeEquipment的子類Chassis。Chassis從CompositeEquipment繼承了與子類有關的那些操作。共151頁第22頁Composite(組合)模式共151頁第23頁Composite(組合)模式我們可用相似的方式定義其他設備容器,如Cabinet和Bus。這樣我們就得到了組裝一臺(非常簡單)個人計算機所需的所有設備。共151頁第24頁Composite(組合)模式共151頁第25頁Composite(組合)模式說明:

Composite模式在實現中有一個問題就是要提供對于子節點(Leaf)的管理策略,這里使用的是STL中的list,可以提供其他的實現方式,如數組、Hash表等。共151頁第26頁Composite(組合)模式共151頁第27頁Composite(組合)模式MFC中的CWnd為典型的組合模式Composite(組合)模式總結:1)組合模式解耦了客戶程序與復雜元素內部結構,從而使客戶程序可以向處理簡單元素一樣來處理復雜元素。2)如果想要創建層次結構,并可以在其中以相同的方式對待所有元素,那么組合模式就是最理想的選擇。共151頁第28頁共151頁第29頁FACADE(外觀)模式問題:接口調用的問題等等…共151頁第30頁FACADE(外觀)模式目的:使系統的各子系統之間關聯最小,引入一個Facade對象,為子系統提供一個簡單的、泛化的設施。為子系統中的一組接口提供一個一致的界面,Facade模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。共151頁第31頁FACADE(外觀)模式動機將一個系統劃分成為若干個子系統有利于降低系統的復雜性。一個常見的設計目標是使子系統間的通信和相互依賴關系達到最小。達到該目標的途徑之一是就是引入一個外觀(facade)對象,它為子系統中較一般的設施提供了一個單一而簡單的界面。共151頁第32頁FACADE(外觀)模式FACADE(外觀)模式共151頁第33頁共151頁第34頁FACADE(外觀)模式共151頁第35頁FACADE(外觀)模式Facade(Compiler)

知道哪些子系統類負責處理請求。

將客戶的請求代理給適當的子系統對象。Subsystemclasses(Scanner、Parser、ProgramNode等)

實現子系統的功能。

處理由Facade對象指派的任務。

沒有facade的任何相關信息;即沒有指向

facade的指針。共151頁第36頁FACADE(外觀)模式適用性當你要為一個復雜子系統提供一個簡單接口時。子系統往往會非常復雜,但是其接口應該盡可能簡單,特別是對于一般用戶而言當客戶程序與抽象類的實現部分之間存在著很大的依賴性時,Fa?ade模式可以降低依賴性。在多個子系統的結構中,使用facade模式定義子系統的入口點,有助于降低各子系統之間的依賴性。在層次化結構中,可以使用Facade模式定義系統中每一層的入口。共151頁第37頁FACADE(外觀)模式結構共151頁第38頁FACADE(外觀)模式協作客戶程序通過發送請求給Facade的方式與子系統通訊,Facade將這些消息轉發給適當的子系統對象。盡管是子系統中的有關對象在做實際工作,但Facade模式本身也必須將它的接口轉換成子系統的接口。使用Facade的客戶程序不需要直接訪問子系統對象。共151頁第39頁FACADE(外觀)模式效果1)它對客戶屏蔽子系統組件,因而減少了客戶處理的對象的數目并使得子系統使用起來更加方便。

2)它實現了子系統與客戶之間的松耦合關系,而子系統內部的功能組件往往是緊耦合的。3)如果應用需要,它并不限制它們使用子系統類。共151頁第40頁FACADE(外觀)模式代碼示例如何在一個編譯子系統中使用Facade模式?共151頁第41頁FACADE(外觀)模式Scanner類接收字符流并產生一個標識符流,一次產生一個標識符(token)。共151頁第42頁FACADE(外觀)模式Parser類由Scanner生成的標識符構建一棵語法分析樹。共151頁第43頁FACADE(外觀)模式Parser回調ProgramNodeBuilder逐步建立語法分析樹,共151頁第44頁FACADE(外觀)模式共151頁第45頁FACADE(外觀)模式ProgramNode定義了一個接口用于操作程序節點和它的子節點(如果有的話)。共151頁第46頁FACADE(外觀)模式共151頁第47頁FACADE(外觀)模式Traverse操作以一個CodeGenerator對象為參數,ProgramNode子類使用這個對象產生機器代碼,共151頁第48頁FACADE(外觀)模式ProgramNode的每個子類在實現Traverse時,對它的ProgramNode子對象調用Traverse。每個子類依次對它的子節點做同樣的動作,這樣一直遞歸下去。共151頁第49頁FACADE(外觀)模式例如,ExpressionNode像這樣定義Traverse:共151頁第50頁Compiler類

共151頁第51頁FACADE(外觀)模式說明:

Facade模式在高層提供了一個統一的接口,解耦了系統。Mediator模式和Facade有類似的地方。但是Mediator主要目的是對象間的訪問的解耦(通訊時候的協議)。FACADE(外觀)模式Facade的幾個要點1)從客戶程序的角度來看,Facade模式不僅簡化了整個組件系統的接口,同時對于組件內部與外部客戶程序來說,從某種程度上也達到了一種“解耦”的效果——內部子系統的任何變化不會影響到Fa?ade接口的變化。

2)Fa?ade設計模式更注重從架構的層次去看整個系統,而不是單個類的層次。Fa?ade很多時候更是一種架構設計模式。

3)Fa?ade設計模式并非一個集裝箱,可以任意地放進任何多個對象。Fa?ade模式中組件的內部應該是“相互耦合關系比較大的一系列組件”,而不是一個簡單的功能集合。共151頁第52頁FACADE(外觀)模式與其他模式的區分

Fa?ade模式注重簡化接口

Adapter模式注重轉換接口

Bridge模式注重分離接口(抽象)與其實現

Decorator模式注重穩定接口的前提下為對象擴展功能。共151頁第53頁FACADE(外觀)模式保安系統的例子共151頁第54頁FACADE(外觀)模式改進方法——系統的控制臺,作為保安系統的用戶界面共151頁第55頁共151頁第56頁Command模式目的:將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日志,以及支持可撤消的操作。共151頁第57頁Command模式共151頁第58頁Command模式

用Command對象可很容易的實現菜單(Menu),每一菜單中的選項都是一個菜單項(MenuItem)類的實例。一個Application類創建這些菜單和它們的菜單項以及其余的用戶界面。該Application類還跟蹤用戶已打開的Document對象。共151頁第59頁Command模式

該應用為每一個菜單項配置一個具體的Command子類的實例。當用戶選擇了一個菜單項時,該MenuItem對象調用它的Command對象的Execute方法,而Execute執行相應操作。

MenuItem對象并不知道它們使用的是Command的哪一個子類。Command子類里存放著請求的接收者,而Execute操作將調用該接收者的一個或多個操作。共151頁第60頁Command模式共151頁第61頁Command模式共151頁第62頁Command模式

有時一個MenuItem需要執行一系列命令。例如,使一個頁面按正常大小居中的MenuItem可由一個CenterDocumentCommand對象和一個NormalSizeCommand對象構建。因為這種需將多條命令串接起來的情況很常見,我們定義一個MacroCommand類來讓一個MenuItem執行任意數目的命令。共151頁第63頁Command模式共151頁第64頁Command模式適用性像上面討論的MenuItem對象那樣,抽象出待執行的動作以參數化某對象。你可用過程語言中的回調(callback)函數表達這種參數化機制。所謂回調函數是指函數先在某處注冊,而它將在稍后某個需要的時候被調用。Command模式是回調機制的一個面向對象的替代品。共151頁第65頁Command模式支持取消操作。Command的Excute操作可在實施操作前將狀態存儲起來,在取消操作時這個狀態用來消除該操作的影響。Command接口必須添加一個Unexecute操作,該操作取消上一次Execute調用的效果。執行的命令被存儲在一個歷史列表中。可通過向后和向前遍歷這一列表并分別調用Unexecute和Execute來實現重數不限的“取消”和“重做”。共151頁第66頁Command模式

支持修改日志,這樣當系統崩潰時,這些修改可以被重做一遍。在Command接口中添加裝載操作和存儲操作,可以用來保持變動的一個一致的修改日志。從崩潰中恢復的過程包括從磁盤中重新讀入記錄下來的命令并用Execute操作重新執行它們。共151頁第67頁Command模式結構共151頁第68頁Command模式協作?Client創建一個ConcreteCommand對象并指定它的Receiver對象。?某Invoker對象存儲該ConcreteCommand對象。?該Invoker通過調用Command對象的Execute操作來提交一個請求。若該命令是可撤消的,ConcreteCommand就在執行Execute操作之前存儲當前狀態以用于取消該命令。共151頁第69頁Command模式ConcreteCommand對象調用它的Receiver的一些操作以執行該請求共151頁第70頁Command模式效果將調用操作的對象與知道如何實現該操作的對象解耦。增加新的Command很容易,因為這無需改變已有的類。你可將多個命令裝配成一個復合命令。例如是前面描述的MacroCommand類。一般說來,復合命令是Composite模式的一個實例。共151頁第71頁Command模式代碼示例抽象的Command類:共151頁第72頁Command模式OpenCommand打開一個名字由用戶指定的文檔。OpenCommand的構造函數需要一個

Application對象作為參數。AskUser是一個提示用戶輸入要打開的文檔名的實現例程。共151頁第73頁Command模式共151頁第74頁Command模式共151頁第75頁Command模式PasteCommand需要一個Document對象作為其接收者。該接收者將作為一個參數給

PasteCommand的構造函數。共151頁第76頁Command模式共151頁第77頁Command模式對于簡單的不能取消和不需參數的命令,可以用一個類模板來參數化該命令的接收者。我們將為這些命令定義一個模板子類SimpleCommand.用Receiver類型參數化SimpleCommand,并維護一個接收者對象和一個動作之間的綁定,而這一動作是用指向一個成員函數的指針存儲的。共151頁第78頁Command模式共151頁第79頁Command模式構造器存儲接收者和對應實例變量中的動作。Execute操作實施接收者的這個動作。共151頁第80頁Command模式創建一個調用Myclass類的一個實例上的Action的Command對象共151頁第81頁Command模式MacroCommand管理一個子命令序列,它提供了增加和刪除子命令的操作。這里不需要顯式的接收者,因為這些子命令已經定義了它們各自的接收者。共151頁第82頁Command模式共151頁第83頁Command模式MacroCommand的關鍵是它的Execute成員函數。它遍歷所有的子命令并調用其各自的Execute操作。共151頁第84頁Command模式共151頁第85頁Command模式應用:

Command模式在界面設計中應用廣泛。Java的Swing中菜單命令都是使用Command模式。共151頁第86頁MEMENTO(備忘錄)模式意圖在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。這樣以后就可將該對象恢復到原先保存的狀態。共151頁第87頁MEMENTO(備忘錄)模式動機為了允許用戶取消不確定的操作或從錯誤中恢復過來,需要實現檢查點和取消機制,而要實現這些機制,你必須事先將狀態信息保存在某處,這樣才能將對象恢復到它們先前的狀態。事先將狀態信息保存與對象的封裝性沖突。共151頁第88頁MEMENTO(備忘錄)模式可用備忘錄(Memento)模式解決這一問題一個備忘錄(memento)是一個對象,它存儲另一個對象在某個瞬間的內部狀態,而后者稱為備忘錄的原發器(originator)。當需要設置原發器的檢查點時,取消操作機制會向原發器請求一個備忘錄。原發器用描述當前狀態的信息初始化該備忘錄。只有原發器可以向備忘錄中存取信息,備忘錄對其他的對象“不可見”。共151頁第89頁MEMENTO(備忘錄)模式圖形編輯器共151頁第90頁圖形編輯器的例子中,ConstraintSolver可作為一個原發器。下面的事件序列描述了取消操作的過程:1)作為移動操作的一個副作用,編輯器向ConstraintSolver請求一個備忘錄。2)ConstraintSolver創建并返回一個備忘錄,在這個例子中該備忘錄是SolverState類的一個實例。SolverState備忘錄包含一些描述ConstraintSolver的內部等式和變量當前狀態的數據結構。MEMENTO(備忘錄)模式共151頁第91頁MEMENTO(備忘錄)模式3)此后,當用戶取消移動操作時,編輯器將SolverState備忘錄送回給ConstraintSolver。4)根據SolverState備忘錄中的信息,ConstraintSolver改變它的內部結構以精確地將它的等式和變量返回到它們各自先前的狀態。共151頁第92頁適用性必須保存一個對象在某一個時刻的(部分)狀態,這樣以后需要時它才能恢復到先前的狀態。如果一個用接口來讓其它對象直接得到這些狀態,將會暴露對象的實現細節并破壞對象的封裝性。MEMENTO(備忘錄)模式共151頁第93頁結構MEMENTO(備忘錄)模式共151頁第94頁Memento(備忘錄,如SolverState)—

備忘錄存儲原發器對象的內部狀態。原發器根據需要決定備忘錄存儲原發器的哪些內部狀態。—

防止原發器以外的其他對象訪問備忘錄。

Originator(原發器,如ConstraintSolver)—

原發器創建一個備忘錄,用以記錄當前時刻它的內部狀態。—

使用備忘錄恢復內部狀態.。MEMENTO(備忘錄)模式共151頁第95頁Caretaker(負責人,如undomechanism)—

負責保存好備忘錄。—

不能對備忘錄的內容進行操作或檢查。MEMENTO(備忘錄)模式共151頁第96頁協作備忘錄是被動的。管理器向原發器請求一個備忘錄,保留一段時間后,將其送回給原發器,如下面的交互圖所示:MEMENTO(備忘錄)模式共151頁第97頁MEMENTO(備忘錄)模式共151頁第98頁效果1)保持封裝邊界2)簡化了原發器3)使用備忘錄可能代價很高4)定義窄接口和寬接口5)維護備忘錄的潛在代價MEMENTO(備忘錄)模式共151頁第99頁實現下面是當實現備忘錄模式時應考慮的兩個問題:1)語言支持備忘錄有兩個接口:一個為原發器所使用的寬接口,一個為其他對象所使用的窄接口。理想的實現語言應可支持兩級的靜態保護。MEMENTO(備忘錄)模式共151頁第100頁共151頁第101頁2)存儲增量式改變如果備忘錄的創建及其返回(給它們的原發器)的順序是可預測的,備忘錄可以僅存儲原發器內部狀態的增量改變。MEMENTO(備忘錄)模式共151頁第102頁

代碼示例此處給出的C++代碼展示的是前面討論過的ConstraintSolver的例子。

MoveCommand命令對象來執行(取消)一個圖形對象從一個位置到另一個位置的移動變換。MEMENTO(備忘錄)模式共151頁第103頁MEMENTO(備忘錄)模式共151頁第104頁共151頁第105頁給定這些接口,我們可以實現MoveCommand的成員函數Execute和Unexecute如下:共151頁第106頁MEMENTO模式說明:A:定義:Memento對象是一個保存另外一個對象內部狀態拷貝的對象,這樣以后就可以將該對象恢復到原先保存的狀態。B:Memento模式的用意是在不破壞封裝的條件下,將一個對象的狀態捕捉住,并外部化,存儲起來,從而可以在將來合適的時候把這個對象還原到存儲起來的狀態。

共151頁第107頁MEMENTO模式C:Memento模式所涉及的角色有三個,備忘錄角色、發起人角色和負責人角色。備忘錄角色的作用:(1)將發起人對象的內部狀態存儲起來,備忘錄可以根據發起人對象的判斷來決定存儲多少發起人對象的內部狀態。(2)

備忘錄可以保護其內容不被發起人對象之外的任何對象所讀取。

共151頁第108頁MEMENTO模式發起人角色的作用:(1)

創建一個含有當前內部狀態的備忘錄對象。(2)使用備忘錄對象存儲其內部狀態。負責人角色的作用:

(1)負責保存備忘錄對象(2)不檢查備忘錄對象的內容。

共151頁第109頁Iterator模式目的:

Iterator模式是用來解決對一個聚合對象的遍歷問題,將對聚合的遍歷封裝到一個類中進行,這樣就避免了暴露這個聚合對象的內部表示的可能。共151頁第110頁Iterator模式動機一個聚合對象,如列表(list),應該提供一種方法來讓別人可以訪問它的元素,而又不需暴露它的內部結構.此外,針對不同的需要,可能要以不同的方式遍歷這個列表。但是即使可以預見到所需的那些遍歷操作,你可能也不希望列表的接口中充斥著各種不同遍歷的操作。有時還可能需要在同一個表列上同時進行多個遍歷。共151頁第111頁Iterator模式鏈表迭代器結構圖:共151頁第112頁Iterator模式將遍歷機制與列表對象分離使我們可以定義不同的迭代器來實現不同的遍歷策略,而無需在列表接口中列舉它們。例如,過濾表列迭代器(FilteringListIterator)可能只訪問那些滿足特定過濾約束條件的元素。注意:迭代器和列表是耦合在一起的,而且客戶對象必須知道遍歷的是一個列表而不是其他聚合結構。共151頁第113頁Iterator模式適用性:訪問一個聚合對象的內容而無需暴露它的內部表示。支持對聚合對象的多種遍歷。為遍歷不同的聚合結構提供一個統一的接口(即,支持多態迭代)。共151頁第114頁Iterator模式結構:共151頁第115頁Iterator模式參與者

Iterator(迭代器)—

迭代器定義訪問和遍歷元素的接口。ConcreteIterator(具體迭代器)—

具體迭代器實現迭代器接口。—

對該聚合遍歷時跟蹤當前位置。

Aggregate(聚合)—

聚合定義創建相應迭代器對象的接口。共151頁第116頁Iterator模式ConcreteAggregate(具體聚合)—

具體聚合實現創建相應迭代器的接口,該操作返回ConcreteIterator的一個適當的實例。協作:

ConcreteIterator跟蹤聚合中的當前對象,并能夠計算出待遍歷的后繼對象。共151頁第117頁Iterator模式效果

1)它支持以不同的方式遍歷一個聚合

2)迭代器簡化了聚合的接口

3)在同一個聚合上可以有多個遍歷共151頁第118頁Iterator模式代碼示例:一個簡單List類的實現,它是我們的基礎庫的一部分。我們將給出兩個迭代器的實現,一個以從前到后的次序遍歷該表列,而另一個以從后到前的次序遍歷。共151頁第119頁Iterator模式共151頁第120頁Iterator模式共151頁第121頁Iterator模式共151頁第122頁Iterator模式共151頁第123頁Iterator模式共151頁第124頁Iterator模式共151頁第125頁Iterator模式ReverseListIterator的實現是幾乎是一樣的,只不過它的First操作將_current置于列表的末尾,而Next操作將_current減一,向表頭的方向前進一步。共151頁第126頁Iterator模式共151頁第127頁Iterator模式共151頁第128頁Iterator模式討論:

Iterator模式的應用很常見,我們在開發中就經常會用到STL中預定義好的Iterator來對STL類進行遍歷(Vector、list等)。Composite模式中對Iterator模式的應用。Iterator模式Iterator模式的優點1)實現功能分離,簡化容器接口。讓容器只實現本身的基本功能,把迭代功能委讓給外部類實現,符合類的設計原則。2)隱藏容器的實現細節。3)為容器或其子容器提供了一個統一接口,一方面方便調用;另一方面使得調用者不必關注迭代器的實現細節。4)可以為容器或其子容器實現不同的迭代方法或多個迭代方法。共151頁第129頁共151頁第130頁Prototype模式意圖用原型實例指定創建對象的種類,并且通過拷貝這些原型創建新的對象。共151頁第131頁Prototype模式動機共151頁第132頁Prototype模式結構共151頁第133頁Prototype模式參與者?Prototype(Graphic)

聲明一個克隆自身的接口。?ConcretePrototype(Staff、WholeNote、HalfNote)

實現一個克隆自身的操作。?Client(GraphicTool)

讓一個原型克隆自身從而創建一個新的對象。共151頁第134頁Prototype模式代碼示例:classPrototype{public:virtual~Prototype(){};virtualPrototype*Clone()const=0;protected:Prototype(){};};共151頁第135頁Prototype模式classConcretePrototype:publicPrototype{public:ConcretePrototype(){};ConcretePrototype(constConcretePrototype&cp);~ConcretePrototype(){};Prototype*Clone()const;};共151頁第136頁Prototype模式ConcretePrototype::ConcretePrototype(constConcretePrototype&cp){cout<<"ConcretePrototypecopy..."<<endl;}Prototype*ConcretePrototype::Clone()const{returnnewConcretePrototype(*this);}共151頁第137頁Prototype模式voidmain(){Prototype*p=newConcretePrototype();Prototype*p1=p->Clone();}共151頁第138頁Prototype模式說明:

Prototype模式的結構和實現都很簡單,其關鍵就是(C++中)拷貝構造函數的實現方式。Java中類的clone方法即是prototype模式的實現。共151頁第139頁Prototype模式討論:

Prototype模式通過復制原型(Prototype)而獲得新對象創建的功能,這里Prototype本身就是“對象工廠”,實際上Prototype模式和Builder模式、AbstractFactory模式都是通過一個類(對象實例)來專門負責對象的創建工作(工廠對象),它們之間的區別是:Builder模式重在復雜對象的一步步創建(并不直接返回對象),

AbstractFactory模式重在產生多個相互依賴類的對象,而Prototype模式重在從自身復制自己創建新類。共151頁第140頁Builder模式意圖將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。共151頁第141頁Builder模式動機當我們要創建的對象很復雜的時候(通常是由很多其他的對象組合而成),我們要要復雜對象的創建過程和這個對象的表示(展示)分離開來,這樣做的好處就是通過一步步的進行復雜對象的構建,由于在每一步的構造過程中可以引入參數,使得經過相同的步驟創建最后得到的對象的展示不一樣。共151頁第142頁Builder模式RTF(RichTextFormat)文檔交換格式的閱讀器共151頁第143頁Builder模式適用性?當創建復雜對象的算法應該獨立于該對象的組成部分以及它們的裝配方式時。?當構造過程必須允許被構造的對象有不同的表示時。共151頁第144頁Builder模式結構共151頁第145頁Builder模式參與者?Builder(TextConverter)—

為創建一個Product對象的各個部件指定抽象接口。?ConcreteBuilder(ASCIIConverter、TeXConverter、TextWidgetConverter)—

實現Builder的接口以構造和裝配該產品的各個部件。—

定義并明確它所創建的表示。—

提供一個檢索產品的接口(例如,

GetASCIIText和GetTextWidget)。共151頁第146頁Builder模式

Director(RTFReader)—構造一個使用Builder接口的對象。

Product(ASCIIText、TeXText、TextWidget)

—表示被構造的復雜對象。ConcreteBuilder創建該產品的內部表示并定義它的裝配過程。

—包含定義組成部件的類,包括將這些部件裝配成最終產品的接口。共151頁第147頁Builder模式協作?客戶創建Director對象,并用它所想要的Builder對象進行配置。?一旦產品部件被生成,導向器就會通知生成器。?生成器處理導向器的請求,并將部件添加到該產品中。?客戶從生成器中檢索產品。共151頁第148頁Builder模式交互圖共151頁第149頁Builder模式效果1)它使你可以改變一個產品的內部表示2)它將構造代碼和表示代碼分開3)它使你可對構造過程進行更精細的控制共151頁第150頁Builder模式代碼示例

首先假設一個復雜對象是由多個部件組成的,Builder模式是把復雜對象的創建和部件的創建分別開來,分別用Builder類和Director類來表示.

首先,需要一個接口,它定義如何創建復雜對象的各個部件:共151頁第151頁Builder模式classBuilder{public:

//創建部件A比如創建汽車車輪

virtualvoidbuildPartA(){};

//創建部件B比如創建汽車方向盤

virtualvoidbuildPartB(){};

//創建部件C比如創建汽車發動機

virtu

溫馨提示

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

評論

0/150

提交評論