UML設計模式Builder,Teplate模式_第1頁
UML設計模式Builder,Teplate模式_第2頁
UML設計模式Builder,Teplate模式_第3頁
UML設計模式Builder,Teplate模式_第4頁
UML設計模式Builder,Teplate模式_第5頁
已閱讀5頁,還剩25頁未讀, 繼續免費閱讀

下載本文檔

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

文檔簡介

10設計模式(4)

Builder、Template模式權巍主要內容10.1Builder模式10.2Template模式10.3Command模式10.4依賴倒轉原則10.5接口隔離原則2UML和設計模式10.1Builder模式--創建型模式軟件系統中,創建“一個復雜對象”:

該對象由各個部分的子對象用一定的算法構成;由于需求的變化,負責對象的各個部分(即:各個子對象)經常變化,但是將它們組合在一起的算法卻相對穩定。如何應對這種變化?提供一種“封裝機制”來隔離出“復雜對象的各個部分”的變化,并令系統中復雜對象的構建算法穩定不變。3UML和設計模式10.1.1Builder模式的結構將一個復雜對象的構建與其表示相分離,使得同樣的構建過程可以創建不同的表示。4UML和設計模式Builder模式的角色:抽象建造者(Builder)角色給出一個抽象接口,以規范產品對象的各個組成成分的建造。具體建造者(ConcreteBuilder)角色在應用程序的調用下創建產品實例,完成2個任務:實現抽象建造者聲明的接口,給出一步步的完成創建產品實例的操作。在建造過程完成后,提供產品的實例。導演者(Director)角色調用具體建造者角色以創建產品對象,與客戶端交互,并不了解產品類的具體知識。產品(Product)角色產品,即:建造中的復雜對象。5UML和設計模式例:買肯德基兒童套餐

典型的兒童餐包括一個主食,一個輔食,一杯飲料和一個玩具(例如漢堡、炸雞、可樂和玩具車)。這些在不同的兒童餐中可以是不同的,但是組合成兒童餐的過程是相同的。客戶端:顧客。想去買一套套餐(這里面包括漢堡,可樂,薯條),可以有1號和2號兩種套餐供顧客選擇。導演者角色:收銀員。知道顧客想要買什么樣的套餐,并告訴餐館員工去準備套餐。建造者角色:餐館員工。按照收銀員的要求去準備具體的套餐,分別放入漢堡,可樂,薯條等。產品角色:最后的套餐,所有的東西放在同一個盤子里面。6UML和設計模式10.1.2Builder模式的示意代碼7UML和設計模式//導演者publicclassDirector{ privateBuilderbuilder;

//Director類的構造方法 Director(Builderbuilder){ this.builder=builder; }

//產品構造方法,負責調用各個零件建造方法 publicvoidconstruct(){ builder=newConcreteBuilder(); builder.buildPart1(); builder.buildPart2(); ...... }}8UML和設計模式//產品publicclassProduct{ //產品的相關內容}//抽象建造者publicabstractclassBuilder{ //產品零件構造方法

publicabstractvoidbuildPart1(); publicabstractvoidbuildPart2(); //產品返回方法

publicabstractProductretrieveResult();}9UML和設計模式//具體建造者publicclassConcreteBuilderextendsBuilder{ privateProductproduct=newProduct(); //產品返回方法

publicProductretrieveResult(){ returnproduct; } //產品零件建造方法

publicvoidbuildPart1(){ //buildthefirstpartoftheproduct } publicvoidbuildPart2(){ //buildthesecondpartoftheproduct } }10UML和設計模式建造模式的使用方法順序圖//客戶端程序classClient{publicstaticvoidmain(String[]args){ Builderbuilder=newConcreteBuilder(); Directordirector=newDirector(builder);

//構造Product director.construct();

//獲得Product對象 Productproduct=builder.retrieveResult();}}11UML和設計模式什么情況下使用Builder模式(1)需要生產的產品對象有復雜的內部結構。(2)需要生產的產品對象的屬性相互依賴。(3)在對象創建過程中會使用到系統中的其他一些對象,這些對象在產品對象的創建過程中不易得到。12UML和設計模式10.1.3例子示例代碼1:

產品、抽象建造者、具體建造者、導演者、客戶代碼例2:

任何證件生成都需要兩個部分組成--姓名和號碼。姓名由“姓”和“名”組成,而號碼則根據不同證件由不同的生成方式。如:學生證("前綴"+號碼),身份證("省份"+"城市"+"出生日期"+"隨機數")。

示例代碼:builder-demo213UML和設計模式10.2模板模式(Template)UML和設計模式14行為型模式在軟件構建過程中,對于某一項任務,它常常有穩定的整體操作結構,但各個子步驟卻有很多改變的需求,或者由于固有的原因(比如框架與應用之間的關系)而無法和任務的整體結構同時實現。如何在確定穩定操作結構的前提下,來靈活應對各個子步驟的變化或者晚期實現需求?10.2.1什么是模板模式Template模板模式:定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。本模式使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。UML和設計模式1510.2.2模板模式的結構UML和設計模式16模板模式的角色抽象模板類:

定義一個或多個抽象的操作,以便讓子類實現;

定義并實現一個模板方法,一般是具體方法;它給出了實現的框架,而框架中的具體組成則在相應的抽象操作中,推遲到子類實現。具體類:

實現父類定義的一個或多個抽象方法。每個抽象模板類可對應多個具體類,每個具體類都給出抽象方法的不同實現UML和設計模式17UML和設計模式18模板模式的一個簡單的例子對多種汽車實現測試的例子(java)abstractpublicclassVehical{//表示汽車 publicabstractvoidstartup(); publicabstractvoidrun(); publicabstractvoidturn(intdegree); publicabstractvoidstop();

//模板方法 publicvoidTest() { //汽車測試的框架邏輯代碼

startup(); run(); turn(...); stop(); }}UML和設計模式19publicclassHongQiCarextendsVehical{//具體汽車

publicabstractvoidstartup(){ ……//紅旗車的具體啟動

} publicabstractvoidrun(){…… } publicabstractvoidturn(intdegree){…… } publicabstractvoidstop(){…… }}publicclassClient{//客戶程序

publicstaticvoidmain(String[]args){ Vehicalhq=newHongQiCar(); hq.Test(); }}10.3Command模式--創建型模式命令模式:將一個請求封裝為一個對象,從而可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日志,以及支持可撤銷的操作。命令模式解耦了命令發送者和接受者之間聯系。命令模式的優點:新的命令很容易被加入系統允許接收方決定是否要拒絕請求容易實現請求日志的記錄、及請求的Undo、Redo20UML和設計模式Command模式的結構21UML和設計模式Command模式的角色:客戶Client:創建了一個具體命令對象并確定其接收者;抽象命令Command:一個所有具體命令類的抽象接口;具體命令ConcreteCommand:負責調用接收者的相應操作,實現接收者和行為之間的弱耦合;請求者Invoker:負責調用命令對象執行請求;接收者Receiver:負責具體實施和執行一個請求。22UML和設計模式10.1.2Command模式的示意代碼23UML和設計模式命令模式的一個簡單的例子(java)實現對電視機的開、關等命令進行封裝,//抽象命令Command,Command.java:publicinterfaceCommand{

voidexecute();

}//具體命令1:關機CommandOff.java:

publicclassCommandOffimplementsCommand{

privateTvmyTv;

publicCommandOff(Tvtv){

myTv=tv;

}

publicvoidexecute(){

myTv.turnOff();

}

}24UML和設計模式//Invoker請求者,Control.java//增加新的具體命令時,需更改此文件publicclassControl{

privateCommandonCommand,offCommand;

publicControl(Commandon,Commandoff){

onCommand=on;

offCommand=off;

}

publicvoidturnOn(){

onCommand.execute();

}

publicvoidturnOff(){

offCommand.execute();

}

}25UML和設計模式命令模式的一個簡單的例子(java)//命令接收者Reserver,TV.javapublicclassTv{

publicintcurrentChannel=0;

publicvoidturnOn(){

System.out.println("Thetelevisinoison.");

}

publicvoidturnOff(){

System.out.println("Thetelevisionisoff.");

}

}26UML和設計模式//具體命令2:開機CommandOn.java:

publicclassCommandOnimplementsCommand{

privateTvmyTv;

publicCommandOn(Tvtv) {

myTv=tv;

}

publicvoidexecute() {

myTv.turnOn();

}

}//可方便添加其他具體命令,如頻道切換命令等27UML和設計模式//客戶程序Client:CommandTest.java:

publicclassCommandTest{

publicstaticvoidmain(String[]args){

//命令接收者

Tv

myTv=newTv();

//開機命令

CommandOnon=newCommandOn(myTv);

//關機命令

CommandOffoff=newCommandOff(myTv);

//命令控制對象,即命令請求者Invoker

Contr

溫馨提示

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

最新文檔

評論

0/150

提交評論