




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
10設(shè)計(jì)模式(4)
Builder、Template模式權(quán)巍主要內(nèi)容10.1Builder模式10.2Template模式10.3Command模式10.4依賴倒轉(zhuǎn)原則10.5接口隔離原則2UML和設(shè)計(jì)模式10.1Builder模式--創(chuàng)建型模式軟件系統(tǒng)中,創(chuàng)建“一個(gè)復(fù)雜對(duì)象”:
該對(duì)象由各個(gè)部分的子對(duì)象用一定的算法構(gòu)成;由于需求的變化,負(fù)責(zé)對(duì)象的各個(gè)部分(即:各個(gè)子對(duì)象)經(jīng)常變化,但是將它們組合在一起的算法卻相對(duì)穩(wěn)定。如何應(yīng)對(duì)這種變化?提供一種“封裝機(jī)制”來(lái)隔離出“復(fù)雜對(duì)象的各個(gè)部分”的變化,并令系統(tǒng)中復(fù)雜對(duì)象的構(gòu)建算法穩(wěn)定不變。3UML和設(shè)計(jì)模式10.1.1Builder模式的結(jié)構(gòu)將一個(gè)復(fù)雜對(duì)象的構(gòu)建與其表示相分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。4UML和設(shè)計(jì)模式Builder模式的角色:抽象建造者(Builder)角色給出一個(gè)抽象接口,以規(guī)范產(chǎn)品對(duì)象的各個(gè)組成成分的建造。具體建造者(ConcreteBuilder)角色在應(yīng)用程序的調(diào)用下創(chuàng)建產(chǎn)品實(shí)例,完成2個(gè)任務(wù):實(shí)現(xiàn)抽象建造者聲明的接口,給出一步步的完成創(chuàng)建產(chǎn)品實(shí)例的操作。在建造過(guò)程完成后,提供產(chǎn)品的實(shí)例。導(dǎo)演者(Director)角色調(diào)用具體建造者角色以創(chuàng)建產(chǎn)品對(duì)象,與客戶端交互,并不了解產(chǎn)品類的具體知識(shí)。產(chǎn)品(Product)角色產(chǎn)品,即:建造中的復(fù)雜對(duì)象。5UML和設(shè)計(jì)模式例:買肯德基兒童套餐
典型的兒童餐包括一個(gè)主食,一個(gè)輔食,一杯飲料和一個(gè)玩具(例如漢堡、炸雞、可樂(lè)和玩具車)。這些在不同的兒童餐中可以是不同的,但是組合成兒童餐的過(guò)程是相同的??蛻舳耍侯櫩?。想去買一套套餐(這里面包括漢堡,可樂(lè),薯?xiàng)l),可以有1號(hào)和2號(hào)兩種套餐供顧客選擇。導(dǎo)演者角色:收銀員。知道顧客想要買什么樣的套餐,并告訴餐館員工去準(zhǔn)備套餐。建造者角色:餐館員工。按照收銀員的要求去準(zhǔn)備具體的套餐,分別放入漢堡,可樂(lè),薯?xiàng)l等。產(chǎn)品角色:最后的套餐,所有的東西放在同一個(gè)盤(pán)子里面。6UML和設(shè)計(jì)模式10.1.2Builder模式的示意代碼7UML和設(shè)計(jì)模式//導(dǎo)演者publicclassDirector{ privateBuilderbuilder;
//Director類的構(gòu)造方法 Director(Builderbuilder){ this.builder=builder; }
//產(chǎn)品構(gòu)造方法,負(fù)責(zé)調(diào)用各個(gè)零件建造方法 publicvoidconstruct(){ builder=newConcreteBuilder(); builder.buildPart1(); builder.buildPart2(); ...... }}8UML和設(shè)計(jì)模式//產(chǎn)品publicclassProduct{ //產(chǎn)品的相關(guān)內(nèi)容}//抽象建造者publicabstractclassBuilder{ //產(chǎn)品零件構(gòu)造方法
publicabstractvoidbuildPart1(); publicabstractvoidbuildPart2(); //產(chǎn)品返回方法
publicabstractProductretrieveResult();}9UML和設(shè)計(jì)模式//具體建造者publicclassConcreteBuilderextendsBuilder{ privateProductproduct=newProduct(); //產(chǎn)品返回方法
publicProductretrieveResult(){ returnproduct; } //產(chǎn)品零件建造方法
publicvoidbuildPart1(){ //buildthefirstpartoftheproduct } publicvoidbuildPart2(){ //buildthesecondpartoftheproduct } }10UML和設(shè)計(jì)模式建造模式的使用方法順序圖//客戶端程序classClient{publicstaticvoidmain(String[]args){ Builderbuilder=newConcreteBuilder(); Directordirector=newDirector(builder);
//構(gòu)造Product director.construct();
//獲得Product對(duì)象 Productproduct=builder.retrieveResult();}}11UML和設(shè)計(jì)模式什么情況下使用Builder模式(1)需要生產(chǎn)的產(chǎn)品對(duì)象有復(fù)雜的內(nèi)部結(jié)構(gòu)。(2)需要生產(chǎn)的產(chǎn)品對(duì)象的屬性相互依賴。(3)在對(duì)象創(chuàng)建過(guò)程中會(huì)使用到系統(tǒng)中的其他一些對(duì)象,這些對(duì)象在產(chǎn)品對(duì)象的創(chuàng)建過(guò)程中不易得到。12UML和設(shè)計(jì)模式10.1.3例子示例代碼1:
產(chǎn)品、抽象建造者、具體建造者、導(dǎo)演者、客戶代碼例2:
任何證件生成都需要兩個(gè)部分組成--姓名和號(hào)碼。姓名由“姓”和“名”組成,而號(hào)碼則根據(jù)不同證件由不同的生成方式。如:學(xué)生證("前綴"+號(hào)碼),身份證("省份"+"城市"+"出生日期"+"隨機(jī)數(shù)")。
示例代碼:builder-demo213UML和設(shè)計(jì)模式10.2模板模式(Template)UML和設(shè)計(jì)模式14行為型模式在軟件構(gòu)建過(guò)程中,對(duì)于某一項(xiàng)任務(wù),它常常有穩(wěn)定的整體操作結(jié)構(gòu),但各個(gè)子步驟卻有很多改變的需求,或者由于固有的原因(比如框架與應(yīng)用之間的關(guān)系)而無(wú)法和任務(wù)的整體結(jié)構(gòu)同時(shí)實(shí)現(xiàn)。如何在確定穩(wěn)定操作結(jié)構(gòu)的前提下,來(lái)靈活應(yīng)對(duì)各個(gè)子步驟的變化或者晚期實(shí)現(xiàn)需求?10.2.1什么是模板模式Template模板模式:定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類中。本模式使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。UML和設(shè)計(jì)模式1510.2.2模板模式的結(jié)構(gòu)UML和設(shè)計(jì)模式16模板模式的角色抽象模板類:
定義一個(gè)或多個(gè)抽象的操作,以便讓子類實(shí)現(xiàn);
定義并實(shí)現(xiàn)一個(gè)模板方法,一般是具體方法;它給出了實(shí)現(xiàn)的框架,而框架中的具體組成則在相應(yīng)的抽象操作中,推遲到子類實(shí)現(xiàn)。具體類:
實(shí)現(xiàn)父類定義的一個(gè)或多個(gè)抽象方法。每個(gè)抽象模板類可對(duì)應(yīng)多個(gè)具體類,每個(gè)具體類都給出抽象方法的不同實(shí)現(xiàn)UML和設(shè)計(jì)模式17UML和設(shè)計(jì)模式18模板模式的一個(gè)簡(jiǎn)單的例子對(duì)多種汽車實(shí)現(xiàn)測(cè)試的例子(java)abstractpublicclassVehical{//表示汽車 publicabstractvoidstartup(); publicabstractvoidrun(); publicabstractvoidturn(intdegree); publicabstractvoidstop();
//模板方法 publicvoidTest() { //汽車測(cè)試的框架邏輯代碼
startup(); run(); turn(...); stop(); }}UML和設(shè)計(jì)模式19publicclassHongQiCarextendsVehical{//具體汽車
publicabstractvoidstartup(){ ……//紅旗車的具體啟動(dòng)
} publicabstractvoidrun(){…… } publicabstractvoidturn(intdegree){…… } publicabstractvoidstop(){…… }}publicclassClient{//客戶程序
publicstaticvoidmain(String[]args){ Vehicalhq=newHongQiCar(); hq.Test(); }}10.3Command模式--創(chuàng)建型模式命令模式:將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化;對(duì)請(qǐng)求排隊(duì)或記錄請(qǐng)求日志,以及支持可撤銷的操作。命令模式解耦了命令發(fā)送者和接受者之間聯(lián)系。命令模式的優(yōu)點(diǎn):新的命令很容易被加入系統(tǒng)允許接收方?jīng)Q定是否要拒絕請(qǐng)求容易實(shí)現(xiàn)請(qǐng)求日志的記錄、及請(qǐng)求的Undo、Redo20UML和設(shè)計(jì)模式Command模式的結(jié)構(gòu)21UML和設(shè)計(jì)模式Command模式的角色:客戶Client:創(chuàng)建了一個(gè)具體命令對(duì)象并確定其接收者;抽象命令Command:一個(gè)所有具體命令類的抽象接口;具體命令ConcreteCommand:負(fù)責(zé)調(diào)用接收者的相應(yīng)操作,實(shí)現(xiàn)接收者和行為之間的弱耦合;請(qǐng)求者Invoker:負(fù)責(zé)調(diào)用命令對(duì)象執(zhí)行請(qǐng)求;接收者Receiver:負(fù)責(zé)具體實(shí)施和執(zhí)行一個(gè)請(qǐng)求。22UML和設(shè)計(jì)模式10.1.2Command模式的示意代碼23UML和設(shè)計(jì)模式命令模式的一個(gè)簡(jiǎn)單的例子(java)實(shí)現(xiàn)對(duì)電視機(jī)的開(kāi)、關(guān)等命令進(jìn)行封裝,//抽象命令Command,Command.java:publicinterfaceCommand{
voidexecute();
}//具體命令1:關(guān)機(jī)CommandOff.java:
publicclassCommandOffimplementsCommand{
privateTvmyTv;
publicCommandOff(Tvtv){
myTv=tv;
}
publicvoidexecute(){
myTv.turnOff();
}
}24UML和設(shè)計(jì)模式//Invoker請(qǐng)求者,Control.java//增加新的具體命令時(shí),需更改此文件publicclassControl{
privateCommandonCommand,offCommand;
publicControl(Commandon,Commandoff){
onCommand=on;
offCommand=off;
}
publicvoidturnOn(){
onCommand.execute();
}
publicvoidturnOff(){
offCommand.execute();
}
}25UML和設(shè)計(jì)模式命令模式的一個(gè)簡(jiǎn)單的例子(java)//命令接收者Reserver,TV.javapublicclassTv{
publicintcurrentChannel=0;
publicvoidturnOn(){
System.out.println("Thetelevisinoison.");
}
publicvoidturnOff(){
System.out.println("Thetelevisionisoff.");
}
}26UML和設(shè)計(jì)模式//具體命令2:開(kāi)機(jī)CommandOn.java:
publicclassCommandOnimplementsCommand{
privateTvmyTv;
publicCommandOn(Tvtv) {
myTv=tv;
}
publicvoidexecute() {
myTv.turnOn();
}
}//可方便添加其他具體命令,如頻道切換命令等27UML和設(shè)計(jì)模式//客戶程序Client:CommandTest.java:
publicclassCommandTest{
publicstaticvoidmain(String[]args){
//命令接收者
Tv
myTv=newTv();
//開(kāi)機(jī)命令
CommandOnon=newCommandOn(myTv);
//關(guān)機(jī)命令
CommandOffoff=newCommandOff(myTv);
//命令控制對(duì)象,即命令請(qǐng)求者Invoker
Contr
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 實(shí)現(xiàn)數(shù)字轉(zhuǎn)型的戰(zhàn)略框架計(jì)劃
- 通過(guò)故事?tīng)I(yíng)銷增強(qiáng)品牌影響力計(jì)劃
- 經(jīng)濟(jì)效益的年度跟蹤計(jì)劃
- 學(xué)校秋季課程設(shè)置與調(diào)整計(jì)劃
- 物流企業(yè)運(yùn)輸配送服務(wù)手冊(cè)
- 公司股權(quán)激勵(lì)方案設(shè)計(jì)指南
- 2025年湖州道路運(yùn)輸貨運(yùn)考試題庫(kù)
- 語(yǔ)言學(xué)概論與語(yǔ)言交際技能試題庫(kù)
- 寫(xiě)字樓商業(yè)合同樣本
- 一級(jí)建造師執(zhí)業(yè)合同標(biāo)準(zhǔn)文本
- 【MOOC】普通地質(zhì)學(xué)-西南石油大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 《醫(yī)療廢物的處理》課件
- 教育培訓(xùn)合作分成協(xié)議書(shū)
- 2024年4月27日浙江省事業(yè)單位招聘《職業(yè)能力傾向測(cè)驗(yàn)》試題
- 煤礦防治水細(xì)則解讀
- 2022塔式太陽(yáng)能熱發(fā)電站吸熱系統(tǒng)施工規(guī)范
- 溺水的預(yù)防與急救 課件 2024-2025學(xué)年人教版(2024)初中體育與健康七年級(jí)全一冊(cè)
- 勤務(wù)輔警合同模板
- 年獸來(lái)了課件
- JT-T-524-2019公路工程水泥混凝土用纖維
- DL-T5501-2015凍土地區(qū)架空輸電線路基礎(chǔ)設(shè)計(jì)技術(shù)規(guī)程
評(píng)論
0/150
提交評(píng)論