興大作業(yè)設(shè)計(jì)模式代碼_第1頁(yè)
興大作業(yè)設(shè)計(jì)模式代碼_第2頁(yè)
興大作業(yè)設(shè)計(jì)模式代碼_第3頁(yè)
興大作業(yè)設(shè)計(jì)模式代碼_第4頁(yè)
興大作業(yè)設(shè)計(jì)模式代碼_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1. 創(chuàng)建Quackable接口package yjx;public interface Quackable public void quack();/Quackable只需做好一件事 Quack(呱呱叫)現(xiàn)在某些鴨子實(shí)現(xiàn)了Quackable接口public class MallardDuck implements Quackable public void quack() System.out.println(Quack);package yjx;public class RedheadDuck implements Quackablepublic void quack() System.o

2、ut.println(Quack);package yjx;public class DuckCall implements Quackable /DuckCall(鴨鳴器)會(huì)呱呱叫,但聽(tīng)起來(lái)并不十分像真的鴨叫public void quack() System.out.println(Kwak);package yjx;public class RubberDuck implements Quackable /當(dāng) RubberDuck(橡皮鴨)呱呱叫時(shí),其聲音是吱吱叫public void quack() System.out.println(Squeak);3. 我們有了鴨子,需要模擬器p

3、ackage yjx;public class DuckSimulator public static void main(String args) /我們的main()方法將讓所有的事情動(dòng)起來(lái) DuckSimulator simulator = new DuckSimulator(); /創(chuàng)建一個(gè)模擬器,然后調(diào)用simulator()方法 simulator.simulate();void simulate() Quackable mallardDuck = new MallardDuck(); /把每一種會(huì)叫的東西都產(chǎn)生一份實(shí)例 Quackable redheadDuck = new Re

4、dheadDuck(); Quackable duckCall = new DuckCall(); Quackable rubberDuck = new RubberDuck();System.out.println(nDuck Simulator); simulate(mallardDuck); /開(kāi)始模擬每種鴨子 simulate(redheadDuck); simulate(duckCall); simulate(rubberDuck);void simulate(Quackable duck) /我們重載了simulate()方法來(lái)模擬一只鴨子 duck.quack();/剩下的事就讓

5、多態(tài)發(fā)揮作用,無(wú)論傳入哪一種對(duì)象,多態(tài)都可調(diào)到正確的方法運(yùn)行后出現(xiàn):Duck SimulatorQuackQuackKwakSqueak4.當(dāng)鴨子出現(xiàn)在這里的時(shí)候,就大概會(huì)有鴨子和鵝,我們?yōu)檫@個(gè)模擬器設(shè)計(jì)了一個(gè)Goose(鵝)類(lèi)。package goosemodel_Sxl;public class Goose public void honk()System.out.println(Honk);/鵝的叫聲是咯咯5.鵝適配器 我們的模擬器期望看到Quackable接口.既然鵝不會(huì)呱呱叫,我們可以利用適配器將鵝適配成鴨子.package goosemodel_Sxl;import duckmod

6、el_Sxl.Quackable;public class GooseAdapter implements QuackableGoose goose;public GooseAdapter(Goose goose)this.goose = goose; public void quack() goose.honk(); 6.模擬器總可以使用鵝了 我們需要?jiǎng)?chuàng)建Goose對(duì)象,將它包裝進(jìn)適配器,以便實(shí)現(xiàn)Quackable。package goosemodel_Sxl;import duckmodel_Sxl.DuckCall;import duckmodel_Sxl.MallardDuck;imp

7、ort duckmodel_Sxl.Quackable;import duckmodel_Sxl.RedheadDuck;import duckmodel_Sxl.RubberDuck;public class DuckSimulator public static void main(String args) /我們的main()方法將讓所有的事情動(dòng)起來(lái) DuckSimulator simulator = new DuckSimulator(); /創(chuàng)建一個(gè)模擬器,然后調(diào)用simulator()方法 simulator.simulate();void simulate() Quackable

8、 mallardDuck = new MallardDuck(); /把每一種會(huì)叫的東西都產(chǎn)生一份實(shí)例 Quackable redheadDuck = new RedheadDuck(); Quackable duckCall = new DuckCall(); Quackable rubberDuck = new RubberDuck(); Quackable gooseDuck = new GooseAdapter(new Goose();/通過(guò)把Goose包裝進(jìn)GooseAdapter,我們就可以讓鵝像鴨子一樣 System.out.println(nDuck Simulator); s

9、imulate(mallardDuck); /開(kāi)始模擬每種鴨子 simulate(redheadDuck); simulate(duckCall); simulate(rubberDuck); simulate(gooseDuck); /一旦鵝被包裝起來(lái),我們就可以把它當(dāng)作其他鴨子的Quackable對(duì)象void simulate(Quackable duck) /我們重載了simulate()方法來(lái)模擬一只鴨子 duck.quack();/剩下的事就讓多態(tài)發(fā)揮作用,無(wú)論傳入哪一種對(duì)象,多態(tài)都可調(diào)到正確的方法7.測(cè)試一下 測(cè)試時(shí),simulate()會(huì)調(diào)用許多對(duì)象的quack()方法,其中包括

10、適配器的quack()方法,結(jié)果出現(xiàn)咯咯叫(honk)Duck SimulatorQuackQuackKwakSqueakHonk8.統(tǒng)計(jì)叫聲的次數(shù) 通過(guò)把鴨子包裝進(jìn)裝飾者對(duì)象,給鴨子一些行為(計(jì)算次數(shù)的行為)。package counter_Sxl;import duckmodel_Sxl.Quackable;public class QuackCounter implements QuackableQuackable duck;static int numberOfQuacks; /用靜態(tài)變量跟蹤所有呱呱叫的次數(shù)public QuackCounter (Quackable duck) /將

11、Quackable當(dāng)作參數(shù)傳入構(gòu)造器,并記錄在實(shí)例變量中。this.duck = duck; public void quack() duck.quack(); /當(dāng)quack()被調(diào)用時(shí),我們就把調(diào)用委托給正在裝飾的Quackable對(duì)象 numberOfQuacks+; /把叫聲的次數(shù)加一 public static int getQuacks() /給裝飾者加入一個(gè)靜態(tài)方法,以便返回在所有的Quackable中發(fā)生的叫聲次數(shù) return numberOfQuacks; 9.更新模擬器,以便創(chuàng)建被裝飾的鴨子 包裝在QuackCounter裝飾者中被實(shí)例化的每個(gè)Quackable對(duì)象pac

12、kage counter_Sxl;import goosemodel_Sxl.Goose;import goosemodel_Sxl.GooseAdapter;import duckmodel_Sxl.DuckCall;import duckmodel_Sxl.MallardDuck;import duckmodel_Sxl.Quackable;import duckmodel_Sxl.RedheadDuck;import duckmodel_Sxl.RubberDuck;public class DuckSimulator public static void main(String arg

13、s) /我們的main()方法將讓所有的事情動(dòng)起來(lái) DuckSimulator simulator = new DuckSimulator(); /創(chuàng)建一個(gè)模擬器,然后調(diào)用simulator()方法 simulator.simulate();void simulate() Quackable mallardDuck = new QuackCounter (new MallardDuck(); /把每一種會(huì)叫的東西都產(chǎn)生一份實(shí)例 Quackable redheadDuck = new QuackCounter(new RedheadDuck(); Quackable duckCall = new

14、 QuackCounter(new DuckCall(); Quackable rubberDuck = new QuackCounter(new RubberDuck(); Quackable gooseDuck = new GooseAdapter(new Goose();/通過(guò)把Goose包裝進(jìn)GooseAdapter,我們就可以讓鵝像鴨子一樣 System.out.println(nDuck Simulator:With Decorator); simulate(mallardDuck); /開(kāi)始模擬每種鴨子 simulate(redheadDuck); simulate(duckCa

15、ll); simulate(rubberDuck); simulate(gooseDuck); /一旦鵝被包裝起來(lái),我們就可以把它當(dāng)作其他鴨子的Quackable對(duì)象 System.out.println(The ducks quacked + QuackCounter.getQuacks() + times);/在這里我們?yōu)檫蛇山袑W(xué)家收集呱呱叫行為void simulate(Quackable duck) /我們重載了simulate()方法來(lái)模擬一只鴨子 duck.quack();/剩下的事就讓多態(tài)發(fā)揮作用,無(wú)論傳入哪一種對(duì)象,多態(tài)都可調(diào)到正確的方法輸出:Duck Simulator:Wi

16、th DecoratorQuackQuackKwakSqueakHonkThe ducks quacked 4times10.我們需要工廠產(chǎn)生鴨子 我們需要一些質(zhì)量控制來(lái)確保鴨子一定是被包裝起來(lái)的.我們要建造一個(gè)工廠,創(chuàng)建裝飾過(guò)得鴨子.此工廠應(yīng)該生產(chǎn)各種不同類(lèi)型的鴨子的產(chǎn)品家族,所以使用抽象工廠模式.package factory_Sxl;import duckmodel_Sxl.Quackable;public abstract class AbstractDuckFactory /定義一個(gè)抽象工廠,它的子類(lèi)們會(huì)創(chuàng)建不同的家族public abstract Quackable createM

17、allardDuck(); /每個(gè)方法創(chuàng)建一種鴨子public abstract Quackable createRedheadDuck();public abstract Quackable createDuckCall();public abstract Quackable createRubberDuck();創(chuàng)建一個(gè)工廠,此工廠創(chuàng)建沒(méi)有裝飾者的鴨子package factory_Sxl;import duckmodel_Sxl.DuckCall;import duckmodel_Sxl.MallardDuck;import duckmodel_Sxl.Quackable;import

18、duckmodel_Sxl.RedheadDuck;import duckmodel_Sxl.RubberDuck;public class DuckFactory extends AbstractDuckFactory / DuckFactory擴(kuò)展抽象工廠public Quackable createMallardDuck() /每個(gè)方法創(chuàng)建一個(gè)產(chǎn)品,一種特定種類(lèi)的Quackable,模擬器并不知道實(shí)際產(chǎn)品是什么,值知道它實(shí)現(xiàn)了Quackable接口return new MallardDuck();public Quackable createRedheadDuck()return new

19、 RedheadDuck();public Quackable createDuckCall()return new DuckCall();public Quackable createRubberDuck()return new RubberDuck();現(xiàn)在創(chuàng)建真正需要的工廠CountingDuckFactorypackage factory_Sxl;import counter_Sxl.QuackCounter;import duckmodel_Sxl.DuckCall;import duckmodel_Sxl.MallardDuck;import duckmodel_Sxl.Quack

20、able;import duckmodel_Sxl.RedheadDuck;import duckmodel_Sxl.RubberDuck;public class CountingDuckFactory extends AbstractDuckFactorypublic Quackable createMallardDuck()return new QuackCounter(new MallardDuck();public Quackable createRedheadDuck()return new QuackCounter(new RedheadDuck();public Quackab

21、le createDuckCall()return new QuackCounter(new DuckCall();public Quackable createRubberDuck()return new QuackCounter(new RubberDuck();11.設(shè)置模擬器來(lái)使用這個(gè)工廠 創(chuàng)建一個(gè)多態(tài)的方法,此方法需要一個(gè)創(chuàng)建對(duì)象的工廠,通過(guò)傳入不同的工廠,我們就會(huì)得到不同的產(chǎn)品家族。package factory_Sxl;import counter_Sxl.QuackCounter;import goosemodel_Sxl.Goose;import goosemodel_Sxl

22、.GooseAdapter;import duckmodel_Sxl.Quackable;public class DuckSimulator public static void main(String args) /我們的main()方法將讓所有的事情動(dòng)起來(lái) DuckSimulator simulator = new DuckSimulator(); /創(chuàng)建一個(gè)模擬器,然后調(diào)用simulator()方法 AbstractDuckFactory duckFactory = new CountingDuckFactory(); /創(chuàng)建工廠,準(zhǔn)備把它傳入simulate()方法 simulato

23、r.simulate(duckFactory);void simulate(AbstractDuckFactory duckFactory) /simulate()方法需要AbstractDuckFactory參數(shù),利用它創(chuàng)建鴨子,而不是直接實(shí)例化鴨子 Quackable mallardDuck = duckFactory.createMallardDuck(); Quackable redheadDuck = duckFactory.createRedheadDuck(); Quackable duckCall = duckFactory.createDuckCall(); Quackabl

24、e rubberDuck =duckFactory.createRubberDuck(); Quackable gooseDuck = new GooseAdapter(new Goose();/通過(guò)把Goose包裝進(jìn)GooseAdapter,我們就可以讓鵝像鴨子一樣 System.out.println(nDuck Simulator:With Decorator); simulate(mallardDuck); /開(kāi)始模擬每種鴨子 simulate(redheadDuck); simulate(duckCall); simulate(rubberDuck); simulate(gooseD

25、uck); /一旦鵝被包裝起來(lái),我們就可以把它當(dāng)作其他鴨子的Quackable對(duì)象 System.out.println(The ducks quacked + QuackCounter.getQuacks() + times);/在這里我們?yōu)檫蛇山袑W(xué)家收集呱呱叫行為void simulate(Quackable duck) /我們重載了simulate()方法來(lái)模擬一只鴨子 duck.quack();/剩下的事就讓多態(tài)發(fā)揮作用,無(wú)論傳入哪一種對(duì)象,多態(tài)都可調(diào)到正確的方法執(zhí)行后:Duck Simulator:With DecoratorQuackQuackKwakSqueakHonkThe d

26、ucks quacked 4times12.讓我們創(chuàng)建一群鴨子(實(shí)際上是一群Quackable) package flock_Sxl;import java.util.ArrayList;import java.util.Iterator;import duckmodel_Sxl.Quackable;public class Flock implements QuackableArrayList quackers = new ArrayList();public void add(Quackable quacker)quackers.add( quacker); public void qua

27、ck() Iterator iterator = quackers.iterator(); while (iterator.hasNext() Quackable quacker = (Quackable)iterator.next(); quacker.quack(); 13.修改模擬器我們需要一些鴨子能進(jìn)入組合結(jié)構(gòu)的代碼。package flock_Sxl;import counter_Sxl.QuackCounter;import duckmodel_Sxl.Quackable;import factory_Sxl.AbstractDuckFactory;import factory_S

28、xl.CountingDuckFactory;import goosemodel_Sxl.Goose;import goosemodel_Sxl.GooseAdapter;public class DuckSimulator public static void main(String args) /我們的main()方法將讓所有的事情動(dòng)起來(lái) DuckSimulator simulator = new DuckSimulator(); /創(chuàng)建一個(gè)模擬器,然后調(diào)用simulator()方法 AbstractDuckFactory duckFactory = new CountingDuckFac

29、tory(); /創(chuàng)建工廠,準(zhǔn)備把它傳入simulate()方法 simulator.simulate(duckFactory);void simulate(AbstractDuckFactory duckFactory) /simulate()方法需要AbstractDuckFactory參數(shù),利用它創(chuàng)建鴨子,而不是直接實(shí)例化鴨子 /Quackable mallardDuck = duckFactory.createMallardDuck(); Quackable redheadDuck = duckFactory.createRedheadDuck(); Quackable duckCal

30、l = duckFactory.createDuckCall(); Quackable rubberDuck =duckFactory.createRubberDuck(); Quackable gooseDuck = new GooseAdapter(new Goose();/通過(guò)把Goose包裝進(jìn)GooseAdapter,我們就可以讓鵝像鴨子一樣 System.out.println(nDuck Simulator:With Decorator - Flocks);Flock flockOfDucks = new Flock();flockOfDucks.add(redheadDuck);

31、flockOfDucks.add(duckCall);flockOfDucks.add(rubberDuck);flockOfDucks.add(gooseDuck);Flock flockOfMallards = new Flock();Quackable mallardOne = duckFactory.createMallardDuck(); Quackable mallardTwo = duckFactory.createMallardDuck(); Quackable mallardThree = duckFactory.createMallardDuck(); Quackable

32、mallardFour = duckFactory.createMallardDuck(); flockOfMallards.add(mallardOne); flockOfMallards.add(mallardTwo); flockOfMallards.add(mallardThree); flockOfMallards.add(mallardFour); flockOfDucks.add(flockOfMallards); /simulate(mallardDuck); /開(kāi)始模擬每種鴨子 /simulate(redheadDuck); /simulate(duckCall); /sim

33、ulate(rubberDuck); /simulate(gooseDuck); /一旦鵝被包裝起來(lái),我們就可以把它當(dāng)作其他鴨子的Quackable對(duì)象 System.out.println(nDuck Simulator:Whole Flock Simulation); simulate(flockOfDucks); System.out.println(nDuck Simulator:Mallard Flock Simulation); simulate(flockOfMallards); System.out.println(The ducks quacked + QuackCounte

34、r.getQuacks() + times);/在這里我們?yōu)檫蛇山袑W(xué)家收集呱呱叫行為void simulate(Quackable duck) /我們重載了simulate()方法來(lái)模擬一只鴨子 duck.quack();/剩下的事就讓多態(tài)發(fā)揮作用,無(wú)論傳入哪一種對(duì)象,多態(tài)都可調(diào)到正確的方法執(zhí)行結(jié)果:Duck Simulator:With Decorator - FlocksDuck Simulator:Whole Flock SimulationQuackKwakSqueakHonkQuackQuackQuackQuackDuck Simulator:Mallard Flock Simula

35、tionQuackQuackQuackQuackThe ducks quacked 11times14.想要觀察個(gè)別鴨子的行為適用觀察者模式 首先需要一個(gè)Observable接口,所謂的Observable就是被觀察的對(duì)象。Observable需要注冊(cè)和通知觀察者的方法。package observable_Sxl;import java.util.Observable;public interface QuackObservable /QuackObservable是一個(gè)接口,任何想被觀察的Quackable都必須實(shí)現(xiàn)QuackObservable接口public void register

36、Observer(Observable observer); /當(dāng)具有注冊(cè)觀察者的方法,任何實(shí)現(xiàn)了Observable接口的對(duì)象都可以監(jiān)聽(tīng)呱呱叫,稍后我們會(huì)定義觀察者接口public void notifyObservers(); /它也有通知觀察者的方法現(xiàn)在我們需要確定所有的Quackable都實(shí)現(xiàn)此接口public interface Quackable extends QuackObservable /我們干脆讓Quackable來(lái)擴(kuò)展此接口public void quack();/Quackable只需做好一件事 Quack(呱呱叫)15.現(xiàn)在我們必須確定所有實(shí)現(xiàn)Quakable的具體

37、類(lèi)都能夠扮演QuackObservable的角色我們要在另一個(gè)被稱(chēng)為Observable的類(lèi)中封裝注冊(cè)和通知的代碼,然后將它和QuackObservable組合在一起,這樣我們只需要一份代碼即可,QuackObservable所有的調(diào)用都委托給Observable輔助類(lèi)public class Observable implements QuackObservable ArrayList duck6 = new ArrayList();QuackObservable duck; public Observable(QuackObservable duck) this.duck = duck;

38、public void registerObserver(Observer observer) duck6.add(observer); public void notifyObservers() Iterator iterator = duck6.iterator();while (iterator.hasNext() Observer duck6 = iterator.next();duck6.update(duck); public Iterator getObservers() return duck6.iterator();16整合Observable輔助類(lèi)和Quackable類(lèi),我

39、們只要確定Quackable類(lèi)是和Observable組合在一起的,并且他們知道怎樣來(lái)委托工作。然后,它們就準(zhǔn)備好成為Observable了。public class MallardDuck2 extends MallardDuck implements QuackablePlusObservable duck6; public MallardDuck2() duck6 = new Observable(this); public void quack() super.quack();notifyObservers(); public void registerObserver(Observe

40、r observer) duck6.registerObserver(observer); public void notifyObservers() duck6.notifyObservers();17 public interface Observer public void update(QuackObservable duck);public class Quackologist implements Observer public void update(QuackObservable duck) System.out.println(Quackologist: + duck + just quacked.); public String toString() return Quackologist;18 public class DuckSimulator private static final AbstractDuckFactory DuckFa

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論