版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
10設(shè)計模式(4)
Builder、Template模式權(quán)巍主要內(nèi)容10.1Builder模式10.2Template模式10.3Command模式10.4依賴倒轉(zhuǎn)原則10.5接口隔離原則2UML和設(shè)計模式10.1Builder模式--創(chuàng)建型模式軟件系統(tǒng)中,創(chuàng)建“一個復(fù)雜對象”:
該對象由各個部分的子對象用一定的算法構(gòu)成;由于需求的變化,負責對象的各個部分(即:各個子對象)經(jīng)常變化,但是將它們組合在一起的算法卻相對穩(wěn)定。如何應(yīng)對這種變化?提供一種“封裝機制”來隔離出“復(fù)雜對象的各個部分”的變化,并令系統(tǒng)中復(fù)雜對象的構(gòu)建算法穩(wěn)定不變。3UML和設(shè)計模式10.1.1Builder模式的結(jié)構(gòu)將一個復(fù)雜對象的構(gòu)建與其表示相分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。4UML和設(shè)計模式Builder模式的角色:抽象建造者(Builder)角色給出一個抽象接口,以規(guī)范產(chǎn)品對象的各個組成成分的建造。具體建造者(ConcreteBuilder)角色在應(yīng)用程序的調(diào)用下創(chuàng)建產(chǎn)品實例,完成2個任務(wù):實現(xiàn)抽象建造者聲明的接口,給出一步步的完成創(chuàng)建產(chǎn)品實例的操作。在建造過程完成后,提供產(chǎn)品的實例。導(dǎo)演者(Director)角色調(diào)用具體建造者角色以創(chuàng)建產(chǎn)品對象,與客戶端交互,并不了解產(chǎn)品類的具體知識。產(chǎn)品(Product)角色產(chǎn)品,即:建造中的復(fù)雜對象。5UML和設(shè)計模式例:買肯德基兒童套餐
典型的兒童餐包括一個主食,一個輔食,一杯飲料和一個玩具(例如漢堡、炸雞、可樂和玩具車)。這些在不同的兒童餐中可以是不同的,但是組合成兒童餐的過程是相同的??蛻舳耍侯櫩?。想去買一套套餐(這里面包括漢堡,可樂,薯條),可以有1號和2號兩種套餐供顧客選擇。導(dǎo)演者角色:收銀員。知道顧客想要買什么樣的套餐,并告訴餐館員工去準備套餐。建造者角色:餐館員工。按照收銀員的要求去準備具體的套餐,分別放入漢堡,可樂,薯條等。產(chǎn)品角色:最后的套餐,所有的東西放在同一個盤子里面。6UML和設(shè)計模式10.1.2Builder模式的示意代碼7UML和設(shè)計模式//導(dǎo)演者publicclassDirector{ privateBuilderbuilder;
//Director類的構(gòu)造方法 Director(Builderbuilder){ this.builder=builder; }
//產(chǎn)品構(gòu)造方法,負責調(diào)用各個零件建造方法 publicvoidconstruct(){ builder=newConcreteBuilder(); builder.buildPart1(); builder.buildPart2(); ...... }}8UML和設(shè)計模式//產(chǎn)品publicclassProduct{ //產(chǎn)品的相關(guān)內(nèi)容}//抽象建造者publicabstractclassBuilder{ //產(chǎn)品零件構(gòu)造方法
publicabstractvoidbuildPart1(); publicabstractvoidbuildPart2(); //產(chǎn)品返回方法
publicabstractProductretrieveResult();}9UML和設(shè)計模式//具體建造者publicclassConcreteBuilderextendsBuilder{ privateProductproduct=newProduct(); //產(chǎn)品返回方法
publicProductretrieveResult(){ returnproduct; } //產(chǎn)品零件建造方法
publicvoidbuildPart1(){ //buildthefirstpartoftheproduct } publicvoidbuildPart2(){ //buildthesecondpartoftheproduct } }10UML和設(shè)計模式建造模式的使用方法順序圖//客戶端程序classClient{publicstaticvoidmain(String[]args){ Builderbuilder=newConcreteBuilder(); Directordirector=newDirector(builder);
//構(gòu)造Product director.construct();
//獲得Product對象 Productproduct=builder.retrieveResult();}}11UML和設(shè)計模式什么情況下使用Builder模式(1)需要生產(chǎn)的產(chǎn)品對象有復(fù)雜的內(nèi)部結(jié)構(gòu)。(2)需要生產(chǎn)的產(chǎn)品對象的屬性相互依賴。(3)在對象創(chuàng)建過程中會使用到系統(tǒng)中的其他一些對象,這些對象在產(chǎn)品對象的創(chuàng)建過程中不易得到。12UML和設(shè)計模式10.1.3例子示例代碼1:
產(chǎn)品、抽象建造者、具體建造者、導(dǎo)演者、客戶代碼例2:
任何證件生成都需要兩個部分組成--姓名和號碼。姓名由“姓”和“名”組成,而號碼則根據(jù)不同證件由不同的生成方式。如:學生證("前綴"+號碼),身份證("省份"+"城市"+"出生日期"+"隨機數(shù)")。
示例代碼:builder-demo213UML和設(shè)計模式10.2模板模式(Template)UML和設(shè)計模式14行為型模式在軟件構(gòu)建過程中,對于某一項任務(wù),它常常有穩(wěn)定的整體操作結(jié)構(gòu),但各個子步驟卻有很多改變的需求,或者由于固有的原因(比如框架與應(yīng)用之間的關(guān)系)而無法和任務(wù)的整體結(jié)構(gòu)同時實現(xiàn)。如何在確定穩(wěn)定操作結(jié)構(gòu)的前提下,來靈活應(yīng)對各個子步驟的變化或者晚期實現(xiàn)需求?10.2.1什么是模板模式Template模板模式:定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。本模式使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。UML和設(shè)計模式1510.2.2模板模式的結(jié)構(gòu)UML和設(shè)計模式16模板模式的角色抽象模板類:
定義一個或多個抽象的操作,以便讓子類實現(xiàn);
定義并實現(xiàn)一個模板方法,一般是具體方法;它給出了實現(xiàn)的框架,而框架中的具體組成則在相應(yīng)的抽象操作中,推遲到子類實現(xiàn)。具體類:
實現(xiàn)父類定義的一個或多個抽象方法。每個抽象模板類可對應(yīng)多個具體類,每個具體類都給出抽象方法的不同實現(xiàn)UML和設(shè)計模式17UML和設(shè)計模式18模板模式的一個簡單的例子對多種汽車實現(xiàn)測試的例子(java)abstractpublicclassVehical{//表示汽車 publicabstractvoidstartup(); publicabstractvoidrun(); publicabstractvoidturn(intdegree); publicabstractvoidstop();
//模板方法 publicvoidTest() { //汽車測試的框架邏輯代碼
startup(); run(); turn(...); stop(); }}UML和設(shè)計模式19publicclassHongQiCarextendsVehical{//具體汽車
publicabstractvoidstartup(){ ……//紅旗車的具體啟動
} publicabstractvoidrun(){…… } publicabstractvoidturn(intdegree){…… } publicabstractvoidstop(){…… }}publicclassClient{//客戶程序
publicstaticvoidmain(String[]args){ Vehicalhq=newHongQiCar(); hq.Test(); }}10.3Command模式--創(chuàng)建型模式命令模式:將一個請求封裝為一個對象,從而可用不同的請求對客戶進行參數(shù)化;對請求排隊或記錄請求日志,以及支持可撤銷的操作。命令模式解耦了命令發(fā)送者和接受者之間聯(lián)系。命令模式的優(yōu)點:新的命令很容易被加入系統(tǒng)允許接收方?jīng)Q定是否要拒絕請求容易實現(xiàn)請求日志的記錄、及請求的Undo、Redo20UML和設(shè)計模式Command模式的結(jié)構(gòu)21UML和設(shè)計模式Command模式的角色:客戶Client:創(chuàng)建了一個具體命令對象并確定其接收者;抽象命令Command:一個所有具體命令類的抽象接口;具體命令ConcreteCommand:負責調(diào)用接收者的相應(yīng)操作,實現(xiàn)接收者和行為之間的弱耦合;請求者Invoker:負責調(diào)用命令對象執(zhí)行請求;接收者Receiver:負責具體實施和執(zhí)行一個請求。22UML和設(shè)計模式10.1.2Command模式的示意代碼23UML和設(shè)計模式命令模式的一個簡單的例子(java)實現(xiàn)對電視機的開、關(guān)等命令進行封裝,//抽象命令Command,Command.java:publicinterfaceCommand{
voidexecute();
}//具體命令1:關(guān)機CommandOff.java:
publicclassCommandOffimplementsCommand{
privateTvmyTv;
publicCommandOff(Tvtv){
myTv=tv;
}
publicvoidexecute(){
myTv.turnOff();
}
}24UML和設(shè)計模式//Invoker請求者,Control.java//增加新的具體命令時,需更改此文件publicclassControl{
privateCommandonCommand,offCommand;
publicControl(Commandon,Commandoff){
onCommand=on;
offCommand=off;
}
publicvoidturnOn(){
onCommand.execute();
}
publicvoidturnOff(){
offCommand.execute();
}
}25UML和設(shè)計模式命令模式的一個簡單的例子(java)//命令接收者Reserver,TV.javapublicclassTv{
publicintcurrentChannel=0;
publicvoidturnOn(){
System.out.println("Thetelevisinoison.");
}
publicvoidturnOff(){
System.out.println("Thetelevisionisoff.");
}
}26UML和設(shè)計模式//具體命令2:開機CommandOn.java:
publicclassCommandOnimplementsCommand{
privateTvmyTv;
publicCommandOn(Tvtv) {
myTv=tv;
}
publicvoidexecute() {
myTv.turnOn();
}
}//可方便添加其他具體命令,如頻道切換命令等27UML和設(shè)計模式//客戶程序Client:CommandTest.java:
publicclassCommandTest{
publicstaticvoidmain(String[]args){
//命令接收者
Tv
myTv=newTv();
//開機命令
CommandOnon=newCommandOn(myTv);
//關(guān)機命令
CommandOffoff=newCommandOff(myTv);
//命令控制對象,即命令請求者Invoker
Contr
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- PLC控制技術(shù)考試模擬題(含答案)
- 養(yǎng)老院環(huán)境保護管理制度
- 交通安全教育課件
- 《打造學習型團隊》課件
- 2024年新能源項目投資委托居間合同范本3篇
- 教育合同范本
- 2024年度特殊工種委托招聘與職業(yè)安全防護用品供應(yīng)合同3篇
- 臨床靜脈留置針護理及并發(fā)癥
- 2024年度綠色有機食材供應(yīng)合作協(xié)議2篇
- 2024天津出租車租賃車輛安全性能檢測合同3篇
- 鐵道概論PPT完整全套教學課件
- 泰語版漢語900句
- 醫(yī)院藥品目錄
- 攪拌站常見安全危害及預(yù)防演示文稿
- 腎病綜合征-課件
- 預(yù)注漿后注漿
- 公路工程施工安全風險評估報告
- 福田鎮(zhèn)農(nóng)村飲水工程初設(shè)報告
- 鋼筋混凝土樓板及樓地面構(gòu)造
- 新疆地方史模版2021
- 生理學知到章節(jié)答案智慧樹2023年暨南大學
評論
0/150
提交評論