設(shè)計(jì)模式行為模式(二)_第1頁
設(shè)計(jì)模式行為模式(二)_第2頁
設(shè)計(jì)模式行為模式(二)_第3頁
設(shè)計(jì)模式行為模式(二)_第4頁
設(shè)計(jì)模式行為模式(二)_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第7章 行為模式(二)7.1 模板方法模式(Template)7.1.1 概念1、名稱Template Method模式也叫模板方法模式,它把具有特定步驟算法中的某些必要的處理委讓給抽象方法,通過子類繼承對(duì)抽象方法的不同實(shí)現(xiàn)改變整個(gè)算法的行為。在作為抽象類的父類里,定義了一個(gè)具有固定算法并可以細(xì)分為多個(gè)步驟的模板方法(public),Template Method模式把這些可以被細(xì)分的可變步驟抽象為可以被子類重載的抽象方法(protected abstract),并通過在子類中的重載(重新定義),做到無需改變模板方法的算法步驟而可以重新定義該算法中的某些特定的步驟。2、結(jié)構(gòu)Template M

2、ethod模式的結(jié)構(gòu)如圖7-1所示。圖7-1 TemplateMethod模式結(jié)構(gòu)3、意圖準(zhǔn)備一個(gè)抽象類,將部分邏輯以具體方法以及具體構(gòu)造子的形式實(shí)現(xiàn),然后聲明一些抽象方法來迫使子類實(shí)現(xiàn)剩余的邏輯。不同的子類可以以不同的方式實(shí)現(xiàn)這些抽象方法,從而對(duì)剩余的邏輯有不同的實(shí)現(xiàn)。4、適用性模板方法適用于以下情況:l 一次性實(shí)現(xiàn)一個(gè)算法的不變的部分,并將可變的行為留給子類來實(shí)現(xiàn)。l 各子類中公共的行為應(yīng)被提取出來并集中到一個(gè)公共父類中以避免代碼重復(fù)。其實(shí)這可以說是一種好的編碼習(xí)慣了。l 控制子類擴(kuò)展。模板方法只在特定點(diǎn)調(diào)用操作,這樣就只允許在這些點(diǎn)進(jìn)行擴(kuò)展。比如上面runBare()方法就只在runTe

3、st前面適用setUp方法。如果你不愿子類來修改你的模板方法定義的框架,你可以采用兩種方式來做:一是在API中不體現(xiàn)出你的模板方法;二、將你的模板方法置為final就可以了??梢钥闯?,使用模板方法模式可以將代碼的公共行為提取出來,達(dá)到復(fù)用的目的。而且,在模板方法模式中,是由父類的模板方法來控制子類中的具體實(shí)現(xiàn)。這樣你在實(shí)現(xiàn)子類的時(shí)候,根本不需要對(duì)業(yè)務(wù)流程有太多的了解。5、角色l 抽象模版(AbstractClass)角色 定義了一個(gè)或多個(gè)抽象操作,以便讓子類實(shí)現(xiàn)。這些抽象操作叫做基本操作,它們是一個(gè)頂級(jí)邏輯的組成步驟。定義并實(shí)現(xiàn)了一個(gè)模版方法。這個(gè)模版方法一般是一個(gè)具體方法,它給出了一個(gè)頂級(jí)邏

4、輯的骨架,而邏輯的組成步驟在相應(yīng)的抽象操作中,推遲到子類實(shí)現(xiàn)。頂級(jí)邏輯也有可能調(diào)用一些具體方法。l 具體模版(ConcreteClass)角色實(shí)現(xiàn)父類所定義的一個(gè)或多個(gè)抽象方法,它們是一個(gè)頂級(jí)邏輯的組成步驟。每一個(gè)抽象模版角色都可以有任意多個(gè)具體模版角色與之對(duì)應(yīng),而每一個(gè)具體模版角色都可以給出這些抽象方法(也就是頂級(jí)邏輯的組成步驟)的不同實(shí)現(xiàn),從而使得頂級(jí)邏輯的實(shí)現(xiàn)各不相同。7.1.2 實(shí)現(xiàn)讓我們先來看一個(gè)具體的關(guān)于報(bào)稅的簡(jiǎn)單例子。其結(jié)構(gòu)如圖7-2所示。圖7-2 結(jié)構(gòu)圖package com.sanlian.mode.templateMethod;/* * 保稅 * author sanlia

5、n * version Nov 23, 2010 2:51:28 PM */public abstract class BasicTax protected float income;/ 你的收入public void reportTax() / 計(jì)算一下你該給省政府交多少稅float sTax = calculateProvinceTax();/ 計(jì)算一下你該給國(guó)家政府交多少稅float fTax = calculateChinaTax();/ 算算你破產(chǎn)沒boolean ok = checkBankBalance(sTax + fTax);if (!ok) / 申請(qǐng)破產(chǎn)fileBankru

6、ptcy(); else / 如果沒破產(chǎn)就把稅交上吧sendMoneyToGov(sTax + fTax);protected abstract float calculateProvinceTax();protected abstract float calculateChinaTax();/* * 檢查銀行帳號(hào)是否破產(chǎn) * param tax * return */private boolean checkBankBalance(float tax)return false;/* * 申請(qǐng)破產(chǎn) */private void fileBankruptcy()System.out.printl

7、n(已破產(chǎn).);/* * 上交稅金 */private void sendMoneyToGov(float tax)System.out.println(上交稅金:+tax);事實(shí)上,不同的省政府設(shè)定的稅率或是計(jì)算方法有可能是不同的,國(guó)家政府在某些時(shí)期對(duì)稅率也會(huì)有所調(diào)整,所以BasicTax抽象類的創(chuàng)建者不必關(guān)心給個(gè)省政府的稅率是如何的,也不必關(guān)心國(guó)家政府會(huì)在什么時(shí)候調(diào)整稅率,他只要知道報(bào)稅人要么報(bào)稅要么申請(qǐng)破產(chǎn)就可以了,BasicTax是個(gè)抽象類,你沒有辦法直接實(shí)例化它,你要做的就是創(chuàng)建一個(gè)繼承自BasicTax的派生類,并實(shí)現(xiàn)calculateProvinceTax和calculateCh

8、inaTax這兩個(gè)抽象方法。/* * 上海的報(bào)稅具體實(shí)現(xiàn) * author sanlian * version Nov 23, 2010 2:51:02 PM */public class ShangHaiTax extends BasicTax Overrideprotected float calculateChinaTax() return income * 0.23F;Overrideprotected float calculateProvinceTax() return income * 0.12F;/* * 重慶報(bào)稅具體實(shí)現(xiàn)類 * author sanlian * version

9、 Nov 23, 2010 2:56:57 PM */public class ChongQingTax extends BasicTax Overrideprotected float calculateChinaTax() return income*0.23F;Overrideprotected float calculateProvinceTax() return income*0.24F;從上面的代碼中你可以看到,ShangHaiTax和ChongQingTax分別為上海和重慶報(bào)稅方法提供了具體的實(shí)現(xiàn):package com.sanlian.mode.templateMethod;/

10、* * 測(cè)試類 * author sanlian * version Nov 23, 2010 2:58:42 PM */public class Test public static void main(String args) System.out.println(-one-);BasicTax one = new ShangHaiTax();one.reportTax();System.out.println(-two-);BasicTax two = new ChongQingTax();two.reportTax();運(yùn)行結(jié)果如圖7-3所示。圖7-3 運(yùn)行結(jié)果好了讓我們來回顧一下,在

11、BasicTax的例子中ReportTax其實(shí)就是一個(gè)模板方法,這個(gè)方法描述了報(bào)稅時(shí)所要執(zhí)行的步驟,卻沒有描述每一步是如何執(zhí)行的,因?yàn)樗蕾嚨姆椒ㄟ€沒有實(shí)現(xiàn)。模板方法強(qiáng)調(diào)的是不同對(duì)象之間及方法之間如何協(xié)作。在實(shí)際情況中,模板方法通常包含了業(yè)務(wù)領(lǐng)域知識(shí),這些領(lǐng)域知識(shí)規(guī)定了不同方法是如何協(xié)作的;抽象方法為模板方法調(diào)用的方法提供了客戶化實(shí)現(xiàn)的手段。模板方法描述了特定操作步驟的骨架或是處理流程,而不是直接規(guī)定給個(gè)操作該如何執(zhí)行,將抽象與具體分割開來,從而保證代碼可以最大限度地被復(fù)用。7.2 策略模式(Strategy Pattern)7.2.1 概念策略模式(Strategy Pattern)中體面

12、了兩個(gè)非常基本的面向?qū)ο笤O(shè)計(jì)的基本原則:封裝變化的概念;編程中是喲個(gè)接口,而不是對(duì)接口實(shí)現(xiàn)。策略模式是開發(fā)人員能夠開發(fā)出由許多可替換的部分組成的軟件,并且各個(gè)部分之間是弱連接的關(guān)系。弱連接的特性使軟件具有更強(qiáng)的可擴(kuò)展性,易于維護(hù);更重要的是,它大大提高了軟件的可重用性。1、名稱策略模式就是定義一組算法,將每個(gè)算法都封裝起來,并且使它們之間可以互換。策略模式使這些算法在客戶端調(diào)用它們的時(shí)候能夠互不影響。2、結(jié)構(gòu)策略模式的結(jié)構(gòu)如圖7-4所示。圖7-4 策略模式結(jié)構(gòu)圖3、意圖定義以系列的算法,把他們一個(gè)個(gè)封裝起來,并且使它們可相互替換。本模式的算法可以獨(dú)立于使用它的客戶而變化。4、適用性l 血多相關(guān)

13、的類僅僅是行為有異。“策略”提供了一種用多個(gè)行為中的一個(gè)行為來配置一個(gè)類的方法。l 需要使用一個(gè)算法的不同變體。例如,您可能會(huì)定義一些反映不同的空間/時(shí)間權(quán)衡的算法。當(dāng)這些變體實(shí)現(xiàn)為一個(gè)算法的類層次時(shí),可以使用策略模式。l 算法封裝客戶不應(yīng)該知道的數(shù)據(jù)??墒褂貌呗阅J揭员苊獗┞稄?fù)雜的、與算法相關(guān)的數(shù)據(jù)結(jié)構(gòu)。l 一個(gè)類定義了多種行為,并切這些行為在這個(gè)類的操作中以多個(gè)條件語句的形式出現(xiàn)。將相關(guān)的條件分支移入它們各自的策略類中以代替這些條件語句。5、策略模式中的各個(gè)角色l Context超類:定義了所有需要繼承這個(gè)類的子類的屬性和方法,并且定義了改變這個(gè)父類變化行為的方法。l 算法接口:定義了具體

14、行為的方法聲明,由這個(gè)接口的實(shí)現(xiàn)類來具體實(shí)現(xiàn)接口定義的行為方法。l 具體算法類:一組具體的算法接口實(shí)現(xiàn)類,代表不同的行為。l 客戶類(Client Class):負(fù)責(zé)創(chuàng)建Context類的實(shí)例,并負(fù)責(zé)創(chuàng)建算法的實(shí)現(xiàn)實(shí)例,然后賦給Context類實(shí)例的爭(zhēng)取算法實(shí)現(xiàn)對(duì)象。7.2.2 作用當(dāng)設(shè)計(jì)至代碼維護(hù)時(shí),為了服用目的而使用繼承,結(jié)局并不完美。對(duì)父類的修改,會(huì)影響到子類型。在超類中增加的方法,會(huì)導(dǎo)致子類也有該方法,甚至練那些不該具備該方法的子類型也無法免除。7.2.3 適用范圍這個(gè)模式的核心是把類的變化行為提取為一個(gè)接口,然后將類的變化部分用這個(gè)接口對(duì)象代替,也即聲明為這個(gè)接口的一個(gè)屬性,然后增加

15、一個(gè)設(shè)置這個(gè)接口的方法,以便以后修改這個(gè)類的具體行為,這樣這個(gè)類可以不用管這個(gè)變化行為的具體實(shí)現(xiàn),將實(shí)現(xiàn)委托給這個(gè)接口的具體實(shí)現(xiàn)。而關(guān)于這個(gè)接口的一系列實(shí)現(xiàn),可以看 成是一族算法。這樣就實(shí)現(xiàn)了將類中變化的部分封裝,算法的使用跟算法的實(shí)現(xiàn)分離,算法被提取出來之后還可以更好的進(jìn)行復(fù)用。在以下幾種情況下通常會(huì)使用策略模式:l 當(dāng)許多相關(guān)的類之間的差異只在于其行為時(shí)。策略模式可以動(dòng)態(tài)地讓一個(gè)對(duì)象在許多行為中選擇一種行為。l 當(dāng)實(shí)現(xiàn)一個(gè)目的有很多中可以選算法時(shí),比如:您出于不同的利弊權(quán)衡考慮定義的那些算法(即相當(dāng)于應(yīng)用不同的策略)。這些具體的算法可以封裝城抽象算法類的派生類,并享用該抽象算法類的統(tǒng)一接口

16、。通過多態(tài)性,客戶端只要持有一個(gè)抽象算法類的對(duì)象,就可以選用任何一個(gè)具體的算法。l 當(dāng)一個(gè)算法使用的數(shù)據(jù)不可以讓客戶端得知時(shí)。使用策略模式可以避免暴露復(fù)雜的算法相關(guān)的數(shù)據(jù)結(jié)構(gòu)。其實(shí)客戶端也沒有必要知道這些算法相關(guān)的知識(shí)和數(shù)據(jù)。l 當(dāng)一類定義有很多行為,切用多個(gè)條件語句來判斷懸著這些行為時(shí)。策略模式可以把這些行為轉(zhuǎn)移到對(duì)應(yīng)的具體策略類中,從而避免了難以維護(hù)的多重條件選擇,體現(xiàn)了面向?qū)ο蟮木幊趟枷搿?.2.4 實(shí)現(xiàn)通過以下步驟,開發(fā)人與啊可以很容易地在軟件中實(shí)現(xiàn)策略模式:l 對(duì)策略對(duì)象定義一個(gè)公共接口。l 編寫策略類,該類實(shí)現(xiàn)了上面的公共接口。l 在使用策略對(duì)象的類中保存一個(gè)對(duì)策略對(duì)象的引用。l

17、在使用策略對(duì)象的類中,實(shí)現(xiàn)對(duì)策略對(duì)象的set和get犯法。先要實(shí)現(xiàn)一個(gè)鴨子模擬器,這個(gè)鴨子模擬器由Duck及其子類描述,代碼分別如下所示。Duck類:package com.sanlian.mode.strategy;/* * 鴨子 * author sanlian * version Nov 23, 2010 9:50:14 AM */public abstract class Duck /* * 叫行為 */public void quack()System.out.println(Quack);/* * 游泳 */public void swim()System.out.println(

18、All ducks float,even decoys.);/* * 外觀 * 因?yàn)槊糠N鴨子的外觀個(gè)不相同,所以定義為抽象方法,由子類型自己完成 */public abstract void display();MallardDuck(野鴨)類:package com.sanlian.mode.strategy;/* * 野鴨 * author sanlian * version Nov 23, 2010 9:54:56 AM */public class MallardDuck extends Duck Overridepublic void display() /野鴨顯示為綠頭System

19、.out.println(Green head.);ReaHeadDuck(紅頭鴨)類:package com.sanlian.mode.strategy;/* * 紅頭鴨 * author sanlian * version Nov 23, 2010 9:56:40 AM */public class ReaHeadDuck extends Duck Overridepublic void display() /紅頭鴨顯示為紅頭System.out.println(Red head.);RubberDuck(橡皮鴨)類:package com.sanlian.mode.strategy;/*

20、 * 橡皮鴨 * author sanlian * version Nov 23, 2010 9:57:07 AM */public class RubberDuck extends Duck /* * 橡皮鴨的叫聲為吱吱叫,所以重寫父類以改寫行為 */public void quack()System.out.println(Squeak);Overridepublic void display() /橡皮鴨顯示為黃頭System.out.println(Yellow head.);上述代碼,初始實(shí)現(xiàn)得非常好?,F(xiàn)在我們?nèi)绻oDuck中加入fly()方法的話,那么在子類型中均有了該方法,于是

21、我們看到了會(huì)飛的橡皮鴨子,你看見過嗎?當(dāng)然,我們可以在子類中通過重寫該方法以解決該方法對(duì)于子類型的影響。但是父類中再增加其它方法呢?通過繼承在父類中提供行為,會(huì)導(dǎo)致如下缺點(diǎn):l 代碼在多個(gè)子類中重復(fù)。l 運(yùn)行時(shí)的行為不容易改變。l 改變會(huì)牽一發(fā)動(dòng)全身,造成部分子類型不想要的改變。以上面舉的鴨子為例,您也許想到使用接口,將飛的行為、叫的行為定義為接口,然后讓Duck的各種子類型實(shí)現(xiàn)這些接口。這時(shí)候代碼如下:/* * 鴨子 * author sanlian * version Nov 23, 2010 9:50:14 AM */public abstract class Duck public v

22、oid swim()System.out.println(All ducks float,even decoys.);public abstract void display();/* * 野鴨 * author sanlian * version Nov 23, 2010 9:54:56 AM */public class MallardDuck extends Duck implements FlyBehavior,QuackBehavior public void quack()System.out.println(Quack);Overridepublic void display()

23、 System.out.println(Green head.);public void fly() System.out.println(Fly.);/* * 紅頭鴨 * author sanlian * version Nov 23, 2010 9:56:40 AM */public class ReaHeadDuck extends Duck implements FlyBehavior,QuackBehaviorOverridepublic void display() System.out.println(Red head.);public void fly() System.out

24、.println(Fly.);public void quack() System.out.println(Quack);/* * 橡皮鴨 * author sanlian * version Nov 23, 2010 9:57:07 AM */public class RubberDuck extends Duck implements QuackBehavior public void quack()System.out.println(Squeak);Overridepublic void display() System.out.println(Yellow head.);上述代碼誰染

25、解決了一部分問題,讓子類型可以有選額的提供一些行為(如fly()方法將不會(huì)出想在橡皮鴨中)。但我們也看到,野鴨子(MallardDuck類)和紅頭鴨(RedHeadDuck類)的一些相同行為代碼不能得到重復(fù)使用。在一段程序之后,讓我們從細(xì)節(jié)中跳出來,關(guān)注一些共性問題。不管使用什么語言,構(gòu)建什么應(yīng)用,在軟件開發(fā)上,一直伴隨著的不變的真理是:需要一直在變化。不管當(dāng)初軟件設(shè)計(jì)得多好,一段時(shí)間之后,總是需要成長(zhǎng)與改變,否則軟件就會(huì)死亡。我們知道,繼承在某種程度上可以實(shí)現(xiàn)代碼重用,但是父類(例如鴨子類Duck)的行為在子類型中是不斷變化的,讓所有子類型都有這些行為是不恰當(dāng)?shù)?。我們可以將這些行為定義為接口

26、,讓Duck的各種子類型去實(shí)現(xiàn),但接口不具有實(shí)現(xiàn)代碼,所以實(shí)現(xiàn)接口無法達(dá)到代碼復(fù)用。這意味著,當(dāng)我們需要修改某個(gè)行為,必須往下追蹤并在每一個(gè)定義此行為的類中修改它,一不小心,會(huì)造成新的錯(cuò)誤。設(shè)計(jì)原則:把應(yīng)用中變化的地方獨(dú)立出來,不要和那些不需要變化的代碼混在一起。這樣代碼變化引起的不經(jīng)意后果變少,系統(tǒng)變得更有彈性。按照上述設(shè)計(jì)原則,我們重新審視之前的Duck代碼。1、分開變化的內(nèi)容和不變的內(nèi)容Duck類中的行為 fly()、quack(),每個(gè)子類型可能有自己特有的表現(xiàn),這就是所謂的變化的內(nèi)容。Duck類中的行為 swim() 每個(gè)子類型的表現(xiàn)均相同,這就是所謂不變的內(nèi)容。我們將變化的內(nèi)容從D

27、uck()類中剝離出來單獨(dú)定義形成接口以及一系列的實(shí)現(xiàn)類型。將變化的內(nèi)容定義形成接口可實(shí)現(xiàn)變化內(nèi)容和不變內(nèi)容的剝離。其實(shí)現(xiàn)類型可實(shí)現(xiàn)變化內(nèi)容的重用。這些實(shí)現(xiàn)類并非Duck.java的子類型,而是專門的一組實(shí)現(xiàn)類,稱之為行為類。由行為類而不是Duck.java的子類型來實(shí)現(xiàn)接口。這樣,才能保證變化的行為獨(dú)立于不變的內(nèi)容。代碼如下:/* * 飛行為接口 * author sanlian * version Nov 23, 2010 10:42:40 AM */public interface FlyBehavior /* * 飛方法 */void fly();/* * 變化的fly行為實(shí)現(xiàn)類之一

28、* author sanlian * version Nov 23, 2010 10:43:29 AM */public class FlyWithWings implements FlyBehavior public void fly() System.out.println(Im flying.);/* * 變化的fly行為實(shí)現(xiàn)類之二 * author sanlian * version Nov 23, 2010 10:43:29 AM */public class FlyNoWay implements FlyBehavior public void fly() System.out.p

29、rintln(I cont fly.);/* * 變化的quack行為接口 * author sanlian * version Nov 23, 2010 10:45:09 AM */public interface QuackBehavior /* * 叫方法 */void quack();/* * 變化的quack行為實(shí)現(xiàn)類之一 * author sanlian * version Nov 23, 2010 10:46:18 AM */public class Quack implements QuackBehavior public void quack() System.out.pri

30、ntln(Quack.);/* * 變化的quack行為實(shí)現(xiàn)類之二 * author sanlian * version Nov 23, 2010 10:47:11 AM */public class Squeak implements QuackBehavior public void quack() System.out.println(Squeak.);/* * 變化的quack行為實(shí)現(xiàn)類之三 * author sanlian * version Nov 23, 2010 10:47:57 AM */public class MuteQuack implements QuackBehav

31、ior public void quack() System.out.println();通過以上設(shè)計(jì),fly()行為以及quack()行為已經(jīng)和Duck.java沒有什么關(guān)系,可以充分得到復(fù)用。而且我們很容易增加新的行為, 既不影響現(xiàn)有的行為,也不影響Duck.java。但是,大家可能有個(gè)疑問,就是在面向?qū)ο笾行袨椴皇求w現(xiàn)為方法嗎?為什么現(xiàn)在被定義形成類(例如Squeak.java)?在OO中,類代表的東西一般是既有狀態(tài)(實(shí)例變量)又有方法。只是在本例中碰巧東西是個(gè)行為。既使是行為,也有屬性及方法,例如飛行行為,也需要一些屬性記錄飛行的狀態(tài),如飛行高度、速度等。2、整合變化的內(nèi)容和不變的內(nèi)容

32、Duck.java將 fly()以及quack()的行為委拖給行為類處理。不變的內(nèi)容如下:package com.sanlian.mode.strategy;/* * 鴨子類 * author sanlian * version Nov 23, 2010 10:49:58 AM */public abstract class Duck /將行為類聲明為接口引用,降低對(duì)行為實(shí)現(xiàn)類型的依賴FlyBehavior flyB;QuackBehavior quackB;public void performFly()/不自行處理fly()行為,而是委托給引用的flyB所指向的行為對(duì)象this.flyB.

33、fly();public void performQuack()this.quackB.quack();public void swim()System.out.println(All ducks float, even decoys.);public abstract void display();Duck.java不關(guān)心如何進(jìn)行fly()以及quack(),這些細(xì)節(jié)交由具體的行為類完成。package com.sanlian.mode.strategy;/* * 野鴨 * author sanlian * version Nov 23, 2010 11:15:16 AM */public

34、class MallardDuck extends Duck /最終可以省略該構(gòu)造方法中的默認(rèn)創(chuàng)建public MallardDuck()flyB = new FlyWithWings();quackB = new Quack();Overridepublic void display() System.out.println(Green head .);測(cè)試類:package com.sanlian.mode.strategy;/* * 測(cè)試類 * author sanlian * version Nov 23, 2010 11:14:43 AM */public class Test pu

35、blic static void main(String args) Duck duck = new MallardDuck();duck.performFly();duck.performQuack();運(yùn)行上面測(cè)試類,其結(jié)果如圖7-5所示。圖7-5 運(yùn)行結(jié)果在Duck.java子類型MallardDuck.java的構(gòu)造方法中,直接實(shí)例化行為類型,在編譯的時(shí)侯便指定具體行為類型。當(dāng)然我們可以通過工廠模式或其它模式進(jìn)一步解藕,或做到在運(yùn)行時(shí)動(dòng)態(tài)地改變行為。3、動(dòng)態(tài)設(shè)定行為在父類Duck.java中增加設(shè)定行為類型的setter方法,接受行為類型對(duì)象的參數(shù)傳入。為了降藕,行為參數(shù)被聲明為接口類型。這樣,既便在運(yùn)行時(shí),也可以通過調(diào)用這兩個(gè)方法以改變行為。package com.sanlian.mode.strategy;/* * 鴨子類 * author sanlian * version Nov 23, 2010 10:49:58 AM */public abstract class Duck /相同部分省略.public void setFlyB(FlyBehavior

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論