超設(shè)計(jì)模式大作業(yè)報(bào)告_第1頁
超設(shè)計(jì)模式大作業(yè)報(bào)告_第2頁
超設(shè)計(jì)模式大作業(yè)報(bào)告_第3頁
超設(shè)計(jì)模式大作業(yè)報(bào)告_第4頁
超設(shè)計(jì)模式大作業(yè)報(bào)告_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、2014-2015 學(xué)年第二學(xué)期設(shè)計(jì)模式大作業(yè)課題名稱:設(shè)計(jì)模式在 Duck 模擬器設(shè)計(jì)中的應(yīng)用班 級(jí):12 級(jí)軟工設(shè)計(jì)(1)班 學(xué) 號(hào):1215115325:超成 績(jī):2015 年 6 月 1 日題目仔細(xì)閱讀Head設(shè)計(jì)模式中第 12一部分的 Duck 模擬器。設(shè)計(jì)一個(gè)類似的鴨子模擬器,除了原有要求外,在一個(gè) Quacklogist 中統(tǒng)計(jì)通知它的鴨子的個(gè)數(shù),在一個(gè)中統(tǒng)計(jì)像鴨子一樣叫的 bird 的個(gè)數(shù),對(duì)二者進(jìn)行比較,給出最終的測(cè)試代碼。問題分析通過對(duì) Head設(shè)計(jì)模式學(xué)習(xí)(JAVA 版)鴨子與策略(Strategy)模式 ,對(duì)于鴨子的模擬器有一定的認(rèn)識(shí)和了解,對(duì)于設(shè)計(jì)模式的設(shè)計(jì)原則:1.

2、邏輯代碼獨(dú)立到單獨(dú)的方法中,注重封裝性-易讀,易復(fù)用。不要在一個(gè)方法中,寫下上百行的邏輯代碼。把各小邏輯代碼獨(dú)立出來,寫于其它方法中,易讀其可重復(fù)調(diào)用。2.寫類,寫方法,寫功能時(shí),應(yīng)考慮其移植性,復(fù)用性:防止代碼!是否可以拿到其它同類事物中應(yīng)該?是否可以拿到其它系統(tǒng)中應(yīng)該?3.熟練運(yùn)用繼承的:找出應(yīng)用中相同之處,且不容易發(fā)生變化的東西,把它們抽取到抽象類中,讓子類去繼承它們;繼承的,也方便將自己的邏輯建立于別人的成果之上。如 ImageField extends JTextField;熟練運(yùn)用接口的:找出應(yīng)用中可能需要變化之處,把它們獨(dú)立出來,不要和那些不需要變化的代碼混在一起。1、模擬鴨子的

3、應(yīng)用程序,要求:一邊呱呱叫。中會(huì)出現(xiàn)各種顏色外形的鴨子,一邊游泳戲水,第法:(代碼)首先設(shè)計(jì)一個(gè)鴨子對(duì)象,大致這樣:public class Duckvoid quack()/.鴨子都會(huì)叫void swim()/.都會(huì)游泳void Display() /.外觀然后鴨子中有各種鴨子一邊游泳戲水,一邊呷呷叫,各種鴨子都繼承 Duck 類,游戲在預(yù)料之中運(yùn)行。在直接編寫出各種鴨子的類:MallardDuck/野鴨,RedheadDuck/紅頭鴨,各類都有三個(gè)方法:quack():叫的方法swim():游水的方法display():外形的方法初始的模擬鴨子的設(shè)計(jì)類圖如下:當(dāng)然,如果不更改業(yè)務(wù)需求的話這

4、樣設(shè)計(jì)也行,但現(xiàn)在想給鴨子增加行為 fly(),問題就出現(xiàn)了,更改后的這樣設(shè)計(jì)的話就可能出現(xiàn)嚴(yán)重 了,可能導(dǎo)致一些不該出現(xiàn) fly 行為的鴨子也具有此行 為了,因此要根據(jù)幾條設(shè)計(jì)原則:找出應(yīng)用中可能需要變化之處,把它們獨(dú)立出來,不要和那些不需要變化的代碼混在一起。把可能要變化的取出并封裝起來,好讓其他部分不會(huì)受影響,系統(tǒng)變的更有彈性。 針對(duì)接口編程,而不是針對(duì)實(shí)現(xiàn)編程?!搬槍?duì)接口編程”真正的意思是“針對(duì)超類(supertype)編程”,關(guān)鍵就在利用多態(tài),這里的接口不僅僅指接口,通常是一個(gè)抽象類或者是一個(gè)接口。 多用組合,少用繼承。 對(duì)鴨子的設(shè)計(jì)進(jìn)行修改。方法二:運(yùn)用繼承的特性,將其同的部分出來

5、,避免重復(fù)編程。即:設(shè)計(jì)一個(gè)鴨子的超類(Superclass),并讓各種鴨子繼承這個(gè)超類。public class Duckpublic void quack() /呱呱叫public void swim()/游泳System.out.prln( 游泳);public abstrt void display(); /*因?yàn)橥庥^不一樣,讓子類自己去決定了。*/對(duì)于它的子類只需簡(jiǎn)單的繼承就可以了,并實(shí)現(xiàn)自己的 display()方法。/野鴨 public class MallardDuck extends Duckpublic void display()System.out.prln(野鴨的顏色

6、.); /紅頭鴨 public class RedheadDuck extends Duckpublic void display()System.out.prln(紅頭鴨的顏色.); 在想給鴨子增加行為 fly(),問題就在簡(jiǎn)單不過了,在超類中在加一個(gè)方法就可以了。public class Duckpublic void quack() /呱呱叫System.out.prln(呱呱叫);public void swim()/游泳System.out.prln( 游泳);public abstract void display(); /*因?yàn)橥庥^不一樣,讓子類自己去決定了。*/ public

7、void fly()System.out.prln(飛吧!鴨子); 對(duì)于不能飛的鴨子,在子類中只需簡(jiǎn)單的覆蓋。/殘廢鴨System.out.prln(呱呱叫);public class DisabledDuck extends Duckpublic void display()System.out.prln(殘廢鴨的顏色.); public void fly()/覆蓋,變成什么事都不做。 其它會(huì)飛的鴨子不用覆蓋。這樣所有的繼承這個(gè)超類的鴨子都會(huì) fly 了。但是問題又出來了,有的鴨子會(huì)飛,有的不能飛。對(duì)于上面的設(shè)計(jì),你可能發(fā)現(xiàn)一些弊端,如果超類有新的特性,子類都必須變動(dòng),這是我 們開發(fā)最不喜歡

8、看到的,一個(gè)類變讓另一個(gè)類也跟著變,這有點(diǎn)不符合 OO 設(shè)計(jì)了。這樣很顯然的耦合了一起。利用繼承耦合度太高了.把容易引起變化的部分提取出來并封裝之,來應(yīng)付以后的變法。雖然代碼量加大了,但可用性提高了,耦合度也降低了。把 Duck 中的 fly 方法和 quack 提取出來。publicerface Flyable public void fly();publicerface Quackable public void quack();最后 Duck 的設(shè)計(jì)成為:public class Duckpublic void swim()/游泳 System.out.prln( 游泳);public

9、abstract void display(); /*因?yàn)橥庥^不一樣,讓子類自 己去決定了。*/而 MallardDuck,RedheadDuck,DisabledDuck 就可以寫成為:/野鴨public class MallardDuck extends Duck implements Flyable,Quackable用接口改進(jìn).public void display()System.out.prln(野鴨的顏色.);public void fly()/實(shí)現(xiàn)該方法public void quack()/實(shí)現(xiàn)該方法/紅頭鴨public class RedheadDuck extends D

10、uck implements Flyable,Quackable public void display()System.out.prln(紅頭鴨的顏色.);public void fly()/實(shí)現(xiàn)該方法public void quack()/實(shí)現(xiàn)該方法/殘廢鴨 只實(shí)現(xiàn) Quackable(能叫不能飛)public class DisabledDuck extends Duck implements Quackable public void display()System.out.prln(殘廢鴨的顏色.);public void quack()/實(shí)現(xiàn)該方法這樣設(shè)計(jì)好處:這樣已設(shè)計(jì),的程序就

11、降低了它們之間的耦合。設(shè)計(jì):Flyable 和 Quackable 接口一開始似乎還挺不錯(cuò)的,解決了問題(只有會(huì)飛到鴨實(shí)現(xiàn) Flyable),但是 Java 接口不具有實(shí)現(xiàn)代碼,所以實(shí)現(xiàn)接口無法達(dá)到代碼的復(fù)用。對(duì)上面各方式的總結(jié):繼承的好處:讓共同部分,可以復(fù)用.避免重復(fù)編程.繼承的不好:耦合性高.一旦超類添加一個(gè)新方法,子類都繼承,擁有此方法,若子類相當(dāng)部分不實(shí)現(xiàn)此方法,則要進(jìn)行大批量修改. 繼承時(shí),子類就不可繼承其它類了.接口的好處:解決了繼承耦合性高.且可讓實(shí)現(xiàn)類,繼承或?qū)崿F(xiàn)其它類或接口.接口的不好:不能真正實(shí)現(xiàn)代碼的復(fù)用.可用以下的策略模式來解決.設(shè)計(jì)原則:找出應(yīng)用中相同之處,且不容易

12、發(fā)生變化的東西,把它們抽取到抽象類中,讓子類去繼承它們;找出應(yīng)用中可能需要變化之處,把它們獨(dú)立出來,不要和那些不需要變化的代碼混在一起?,F(xiàn)在,為了要分開“變化和不變化的部分”,準(zhǔn)備建立兩組類(完全遠(yuǎn)離 Duck 類),一個(gè)是fly相關(guān)的,另一個(gè)是“quack”相關(guān)的,每一組類將實(shí)現(xiàn)各自的動(dòng)作。比方說,有一個(gè)類實(shí)現(xiàn)“呱呱叫”,另一個(gè)類實(shí)現(xiàn)“吱吱叫”,還有一個(gè)類實(shí)現(xiàn)“安靜”??赡苁紫葘憙蓚€(gè)接口。FlyBehavior(飛行行為)和 QuackBehavior(叫的行為).publicerface FlyBehaviorpublic void fly();publicerface QuackBeha

13、viorpublic void quack();在定義一些針對(duì)FlyBehavior 的具體實(shí)現(xiàn)。public class FlyWithWings implements FlyBehavior public void fly()/實(shí)現(xiàn)了所有有翅膀的鴨子飛行行為。public class FlyNoWay implements FlyBehavior public void fly()/什么都不做,不會(huì)飛針對(duì) QuackBehavior 的幾種具體實(shí)現(xiàn)。public class Quack implements QuackBehavior public void quack()/實(shí)現(xiàn)呱呱叫的鴨

14、子public class Squeak implements QuackBehavior public void quack()/實(shí)現(xiàn)吱吱叫的鴨子public class MuteQuack implements QuackBehavior public void quack()/什么都不做,不會(huì)叫這樣的設(shè)計(jì),可以讓飛行和呱呱叫的動(dòng)作被其他的對(duì)象復(fù)用,因?yàn)檫@些行為已經(jīng)與鴨子類無關(guān)了。而增加一些新的行為,不會(huì)影響到既有的行為類,也不會(huì)影響“使用”到飛行行為的鴨子類。最后看看 Duck 如何設(shè)計(jì)。public class Duck-在抽象類中,各接口,定義各接口對(duì)應(yīng)的方法.FlyBehavior

15、 flyBehavior;/接口 QuackBehavior quackBehavior;/接口 public Duck()public abstract void display(); public void swim()/實(shí)現(xiàn)游泳的行為public void performFly()flyBehavior.fly(); -由于是接口,會(huì)根據(jù)繼承類實(shí)現(xiàn)的方式,而調(diào)用相應(yīng)的方法.public void performQuack() quackBehavior.quack();();看看 MallardDuck 如何實(shí)現(xiàn)。-通過構(gòu)造方法,生成飛,叫具體實(shí)現(xiàn)類的實(shí)例,從而指定飛,叫的具體屬性pub

16、lic class MallardDuck extends Duck public MallardDuck flyBehavior = new FlyWithWings (); quackBehavior = new Quack();/因?yàn)?MallardDuck 繼承了 Duck,所有具有 flyBehavior 與 quackBehavior 實(shí)例變量public void display()/實(shí)現(xiàn)這樣就滿足了即可以飛,又可以叫,同時(shí)展現(xiàn)自己的顏色了。這樣的設(shè)計(jì)可以看到是把 flyBehavior ,quackBehavior 的實(shí)例化寫在子類了。還可以動(dòng)態(tài)的來決定。只需在 Duck 中加

17、上兩個(gè)方法。在構(gòu)造方法中對(duì)屬性進(jìn)行賦值與用屬性的 setter 的區(qū)別:構(gòu)造方法中對(duì)屬性進(jìn)行賦值:固定,不可變;用屬性的 setter,可以在實(shí)例化對(duì)象后,動(dòng)態(tài)的變化,比較靈活。 public class DuckFlyBehavior flyBehavior;/接口 QuackBehavior quackBehavior;/接口public void setFlyBehavior(FlyBehavior flyBehavior) this.flyBehavior = flyBehavior;public void setQuackBehavior(QuackBehavior quackBeh

18、avior this.quackBehavior= quackBehavior;改進(jìn)后的設(shè)計(jì)使系統(tǒng)有了更強(qiáng)的彈性,如果再增加其他行為不需要修改原有的代碼,只需要增加代碼就行,也符合 設(shè)計(jì)的開閉原則,以上設(shè)計(jì)就用到了策略模式。策略模式定 義了算法族,分別封裝起來,讓他們之間可以互相替換,此模式讓算法的變化獨(dú)立于使用算法的客戶。當(dāng)然策略模式有好的一方面也有壞的方面。優(yōu)點(diǎn):1、提供了一種替代繼承的方法,而且既保持了繼承的優(yōu)點(diǎn)(代碼重用)還比繼承更靈活(算法獨(dú)立,可以任意擴(kuò)展)。 2、避免程序中使用多重條件轉(zhuǎn)移語句,使系統(tǒng)更靈活,并易于擴(kuò)展。3、遵守大部分 GRASP原則和常用設(shè)計(jì)原則,高內(nèi)聚、低偶合

19、。缺點(diǎn):1、因?yàn)槊總€(gè)具體策略類都會(huì)產(chǎn)生一個(gè)新類,所以會(huì)增加系統(tǒng)需要的類的數(shù)量 2、Strategy 和Context 之間的通信開銷增大。根據(jù)算法的需要,Context 必須向每個(gè)不同的具體Strategy類實(shí)例傳遞不同的參數(shù)。導(dǎo)致Context會(huì)創(chuàng)建和傳遞一些用不到的參數(shù)。主要的代碼實(shí)現(xiàn):fly 行為 /飛行接口public erface FlyBehavior public void fly();/飛public class FlyWithWings implements FlyBehavior public void fly() /不飛public class FlyNoWay impl

20、ements FlyBehavior public void fly() System.out.prln(不會(huì)飛);public class FlyRocketered implements FlyBehavior public void fly() System.out.prln(飛);quack 行為/叫接口public erface QuackBehavior public void quack();/ 嘎嘎叫public class Quack implements QuackBehavior public void quack() System.out.prln(嘎嘎叫);/吱吱叫S

21、ystem.out.prln(正在用翅膀飛行);public class Squeak implements QuackBehavior public void quack() System.out.prln(吱吱叫);/不叫public class MuteQuack implements QuackBehavior public void quack() System.out.prln(不會(huì)叫);實(shí)現(xiàn) Duck 類/鴨子超類public abstract class Duck /默認(rèn)的行為FlyBehavior flyBehavior;QuackBehavior quackBehavior

22、;public Duck() public void setFlyBehavior (FlyBehavior fb) flyBehavior = fb;public void setQuackBehavior(QuackBehavior qb) quackBehavior = qb;abstract void display();public void performFly() flyBehavior.fly();public void performQuack() quackBehavior.quack();public void swim() System.out.prln(正在游泳);建

23、立不同的鴨子類 /野鴨public class MallardDuck extends Duck public MallardDuck() quackBehavior = new Quack();flyBehavior = new FlyWithWings();public void display() System.out.prln(綠頭鴨);/紅頭鴨public class RedHeadDuck extends Duck public RedHeadDuck() flyBehavior = new FlyWithWings();quackBehavior = new Quack();pu

24、blic void display() System.out.prln(紅頭鴨);/橡皮鴨public class RubberDuck extends Duck public RubberDuck() flyBehavior = new FlyNoWay();quackBehavior = new Squeak();public void display() System.out.prln(橡皮鴨);/模型鴨public class MDuck extends Duck public MDuck() flyBehavior = new FlyNoWay();quackBehavior = new Quack();public void display() System.out.prln(模型鴨);調(diào)用代碼如下:public class MiniDuc

溫馨提示

  • 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)論