版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 影樓策劃方案
- 愚人節(jié)主題方案(范文15篇)
- 青春砥礪心共筑美好夢(mèng)
- 夏季安全教育家長(zhǎng)會(huì)
- 手術(shù)室靜脈血栓的預(yù)防及護(hù)理
- 幼兒音樂(lè)活動(dòng)方案(15篇)
- 家長(zhǎng)會(huì)經(jīng)典講話稿(15篇)
- 初級(jí)會(huì)計(jì)實(shí)務(wù)-歷年初級(jí)會(huì)計(jì)職稱(chēng)考試真題節(jié)選
- 智研咨詢(xún)-中國(guó)社區(qū)團(tuán)購(gòu)行業(yè)市場(chǎng)調(diào)查、產(chǎn)業(yè)鏈全景、需求規(guī)模預(yù)測(cè)報(bào)告(2024版)
- 基于改進(jìn)模型參考自適應(yīng)的直線感應(yīng)電機(jī)模型預(yù)測(cè)推力控制研究
- 2025年中國(guó)蛋糕行業(yè)市場(chǎng)規(guī)模及發(fā)展前景研究報(bào)告(智研咨詢(xún)發(fā)布)
- 潤(rùn)滑油過(guò)濾培訓(xùn)
- 護(hù)理組長(zhǎng)年底述職報(bào)告
- 浙江省紹興市2023-2024學(xué)年高一上學(xué)期期末考試物理試題(含答案)
- 《住院患者身體約束的護(hù)理》團(tuán)體標(biāo)準(zhǔn)解讀課件
- 2013年6月22日下午湖北省公務(wù)員國(guó)家安全局面試真題
- 2024-2030年中國(guó)生命體征監(jiān)測(cè)行業(yè)市場(chǎng)發(fā)展趨勢(shì)與前景展望戰(zhàn)略分析報(bào)告
- 唐山市重點(diǎn)中學(xué)2024-2025學(xué)年全國(guó)高考大聯(lián)考信息卷:數(shù)學(xué)試題試卷(3)含解析
- 未成年上班知情協(xié)議書(shū)
- DZ∕T 0213-2020 礦產(chǎn)地質(zhì)勘查規(guī)范 石灰?guī)r、水泥配料類(lèi)(正式版)
- 溫泉經(jīng)營(yíng)規(guī)劃方案
評(píng)論
0/150
提交評(píng)論