版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、徐海蛟博士實(shí)驗(yàn)一工廠模式的應(yīng)用【實(shí)驗(yàn)?zāi)康摹?)掌握工廠模式(Factory)的特點(diǎn)2)分析具體問題,使用工廠模式進(jìn)行設(shè)計(jì)?!緦?shí)驗(yàn)內(nèi)容和要求】有一個(gè) OEM制造商代理做 HP筆記本電腦(Laptop),后來該制造商得到了更多的品牌筆記本電腦的訂單 Acer、Lenovo、Dell,該 OEM商發(fā)現(xiàn),如果一次同時(shí)做很多個(gè)牌子的本本,有些不利于管理。利用工廠模式改善設(shè)計(jì),用控制臺應(yīng)用程序?qū)崿F(xiàn)該 OEM制造商的工廠模式。該模式的 UML圖如下?!灸J経ML圖】【模式代碼(JAVA語言實(shí)現(xiàn))】publicclass FactoryMethod / 主類publicstaticvoid main(Stri
2、ng args) Computer c; Factory f = new DellFactory(); c = f.getComputerType(); c.ComputerType(); f = new LenovoFactory(); 1代碼重構(gòu)與設(shè)計(jì)模式課堂實(shí)驗(yàn)徐海蛟博士c = f.getComputerType(); c.ComputerType(); f = new AcerFactory(); c = f.getComputerType(); c.ComputerType(); interface Factory Computer getComputerType(); class
3、DellFactoryimplements Factory Overridepublic Computer getComputerType() returnnew Dell(); classAcerFactory implements Factory Overridepublic Computer getComputerType() returnnew Acer(); class LenovoFactory implements Factory Overridepublic Computer getComputerType() returnnew Lenovo(); /* * 電腦品牌 */i
4、nterface Computer publicvoid ComputerType(); class Dell implements Computer Overridepublicvoid ComputerType() / TODO Autogenerated method stub2代碼重構(gòu)與設(shè)計(jì)模式課堂實(shí)驗(yàn)徐海蛟博士System.out.println("Dell Computer"); class Acer implements Computer Overridepublicvoid ComputerType() System.out.println("Ac
5、er Computer"); class Lenovo implements Computer Overridepublicvoid ComputerType() / TODOAutogenerated method stubSystem.out.println("Lenovo Computer"); 【運(yùn)行截圖】【實(shí)驗(yàn)小結(jié)】通過本次實(shí)驗(yàn),學(xué)會(huì)了使用工廠方法模式。工廠方法模式的適用性如下:當(dāng)一個(gè)類不知道它所必須創(chuàng)建的對象的類時(shí)。當(dāng)一個(gè)類希望由它的子類來指定它所創(chuàng)建的對象時(shí)。當(dāng)類將創(chuàng)建對象的職責(zé)委托給多個(gè)幫助子類中的某一個(gè),并且希望將哪一個(gè)幫助子類是代理這一信息局部
6、化時(shí)。3代碼重構(gòu)與設(shè)計(jì)模式課堂實(shí)驗(yàn)徐海蛟博士實(shí)驗(yàn)二抽象工廠模式的應(yīng)用【實(shí)驗(yàn)?zāi)康摹?)掌握抽象工廠模式(Abstract Factory)的特點(diǎn)2)分析具體問題,使用抽象工廠模式進(jìn)行設(shè)計(jì)?!緦?shí)驗(yàn)內(nèi)容和要求】麥當(dāng)勞(McDonalds)和肯德基(KFC)快餐店都經(jīng)營漢堡(Hamburg)和可樂(Cola),用 JAVA控制臺應(yīng)用程序?qū)崿F(xiàn)這兩個(gè)快餐店經(jīng)營產(chǎn)品的抽象工廠模式。該模式的 UML圖如下?!灸J?UML 圖】【模式代碼】publicclass AbstractFactoryTest publicstaticvoid main(String args) Hamburg h; Cola c; A
7、bstractFactory af = new MDNFactory(); 4代碼重構(gòu)與設(shè)計(jì)模式課堂實(shí)驗(yàn)徐海蛟博士h = af.createHamburg(); c = af.createCola(); h.getHumburg(); c.getCola(); af = new KDJFactory(); h = af.createHamburg(); c = af.createCola(); h.getHumburg(); c.getCola(); interface AbstractFactory Hamburg createHamburg(); Cola createCola(); cl
8、ass MDNFactory implements AbstractFactory Overridepublic Hamburg createHamburg() returnnew MDNHamburg(); Overridepublic Cola createCola() returnnew MDNCola(); class KDJFactory implements AbstractFactory Overridepublic Hamburg createHamburg() returnnew KDJHamburg(); Overridepublic Cola createCola() r
9、eturnnew KDJCola(); /* * kDJ & */interface Hamburg 5代碼重構(gòu)與設(shè)計(jì)模式課堂實(shí)驗(yàn)徐海蛟博士void getHumburg(); class MDNHamburg implements Hamburg Overridepublicvoid getHumburg() System.out.println("MDNHamburg"); class KDJHamburg implements Hamburg Overridepublicvoid getHumburg() / TODO Autogenerated method
10、 stubSystem.out.println("KDJHamburg"); interface Cola void getCola(); class MDNCola implements Cola Overridepublicvoid getCola() System.out.println("MDNCola"); class KDJCola implements Cola Overridepublicvoid getCola() System.out.println("KDJCola"); 【運(yùn)行截圖】6代碼重構(gòu)與設(shè)計(jì)模式課堂實(shí)驗(yàn)
11、徐海蛟博士【實(shí)驗(yàn)小結(jié)】抽象工廠模式主要適用于以下情況:一系列要獨(dú)立于它的產(chǎn)品的創(chuàng)建、組合和表示時(shí)。、一個(gè)系統(tǒng)要由多個(gè)產(chǎn)品系列中的一個(gè)來配置時(shí)。當(dāng)要強(qiáng)調(diào)一系列相關(guān)的產(chǎn)品對象的設(shè)計(jì)以便進(jìn)行聯(lián)合使用時(shí)。當(dāng)要提供一個(gè)產(chǎn)品類庫,而只要顯示它們的接口而不是實(shí)現(xiàn)時(shí)。7代碼重構(gòu)與設(shè)計(jì)模式課堂實(shí)驗(yàn)徐海蛟博士實(shí)驗(yàn)三適配器模式的應(yīng)用【實(shí)驗(yàn)?zāi)康摹?)掌握適配器模式(Adapter)的特點(diǎn)2)分析具體問題,使用適配器模式進(jìn)行設(shè)計(jì)?!緦?shí)驗(yàn)內(nèi)容和要求】一個(gè)軟件團(tuán)隊(duì)開發(fā)繪圖系統(tǒng),設(shè)計(jì)了圓對象(Circle)、矩形對象(Rectangle),線對象(Line)都支持 Draw()函數(shù),即可以通過 Draw()函數(shù)繪制圖形。為了
12、加快項(xiàng)目進(jìn)度,將角度對象(Angle)繪制功能交給了合作團(tuán)隊(duì)實(shí)現(xiàn)。但合作團(tuán)隊(duì)將角度對象繪制函數(shù)定為了 DrawAngle()。繪圖系統(tǒng)提供給用戶后,用戶不滿意,希望能統(tǒng)一的調(diào)用,不用記太多命令。應(yīng)用適配器模式,用 JAVA控制臺應(yīng)用程序完善該設(shè)計(jì)。該模式的 UML圖如下?!灸J経ML圖】【模式代碼】publicclass AdapterTest publicstaticvoid main(String args) Paint a = new AngleAdapter(); a.draw(); 8代碼重構(gòu)與設(shè)計(jì)模式課堂實(shí)驗(yàn)interface Paint 徐海蛟博士void draw(); cla
13、ss Circle implements Paint Overridepublicvoid draw() System.out.println("圓圓"); classRectangle implements Paint Overridepublicvoid draw() System.out.println("方方"); class Line implements Paint Overridepublicvoid draw() System.out.println("線線"); class Angle publicvoid Draw
14、Angle() System.out.println("角度"); class AngleAdapter implements Paint private Angle a=new Angle(); Overridepublicvoid draw() / TODO Autogenerated method stuba.DrawAngle(); 【運(yùn)行截圖】9代碼重構(gòu)與設(shè)計(jì)模式課堂實(shí)驗(yàn)徐海蛟博士【實(shí)驗(yàn)小結(jié)】適配器模式主要適用于以下情況:當(dāng)想要使用一個(gè)已經(jīng)存在的類,但是該類的接口不符合現(xiàn)有的需求時(shí)。當(dāng)需要?jiǎng)?chuàng)建一個(gè)可以被復(fù)用的類,該類能夠與其他無關(guān)的類甚至無法預(yù)見的類協(xié)同工作時(shí)。當(dāng)
15、需要使用一個(gè)已經(jīng)存在的子類,但是不可能對所有的都進(jìn)行子類化以匹配他們的接口時(shí),對象適配器可以對其父類接口進(jìn)行適配。10代碼重構(gòu)與設(shè)計(jì)模式課堂實(shí)驗(yàn)徐海蛟博士實(shí)驗(yàn)四橋接模式的應(yīng)用【實(shí)驗(yàn)?zāi)康摹?)掌握橋接模式(Bridge)的特點(diǎn)2)分析具體問題,使用橋接模式進(jìn)行設(shè)計(jì)。【實(shí)驗(yàn)內(nèi)容和要求】一個(gè)咖啡店可以提供大杯 (JorumCoffee)、中杯 (MediumCoffee)、小杯(SmallCoffee)的咖啡(Coffee),為了滿足不同用戶的口味,在咖啡中可以添加牛奶(Milk),或者糖(Sugar),或者檸檬(Lemon),提供給用戶不同口味的組合,如大杯咖啡加牛奶,中杯咖啡加糖,小杯咖啡加檸檬
16、,小杯咖啡加糖等。應(yīng)用橋接模式,用 JAVA控制臺應(yīng)用程序?qū)崿F(xiàn)該設(shè)計(jì)。該模式的 UML圖如下?!灸J筋悎D】【模式代碼】package Constructor; publicclass BridgeTest publicstaticvoid main(String args) Bridge b; b=new Sugar(); 11代碼重構(gòu)與設(shè)計(jì)模式課堂實(shí)驗(yàn)徐海蛟博士b.setCoffee(new JorumCoffee(); b.getCoffee(); b=new Milk(); b.setCoffee(new SmallCoffee(); b.getCoffee(); interface C
17、offee void getCoffee(); class JorumCoffee implementsCoffee Overridepublicvoid getCoffee() / TODO Autogenerated method stubSystem.out.print("大杯咖啡"); class MediumCoffee implements Coffee Overridepublicvoid getCoffee() / TODO Autogenerated method stubSystem.out.print("中杯咖啡"); class
18、SmallCoffee implements Coffee Overridepublicvoid getCoffee() / TODO Autogenerated method stubSystem.out.print("小杯咖啡"); /* * 配料 */abstractclass Bridge protected Coffee c; void setCoffee(Coffee co) c=co; publicvoid getCoffee() c.getCoffee(); 12代碼重構(gòu)與設(shè)計(jì)模式課堂實(shí)驗(yàn)class Sugar extends Bridge 徐海蛟博士Ove
19、rridepublicvoid getCoffee() c.getCoffee(); System.out.println("加糖"); class Milk extends Bridge Overridepublicvoid getCoffee() c.getCoffee(); System.out.println("加牛奶"); class Lemon extends Bridge Overridepublicvoid getCoffee() c.getCoffee(); System.out.println("加檸檬"); 【運(yùn)
20、行截圖】【實(shí)驗(yàn)小結(jié)】橋接模式的適用情況有:當(dāng)不希望在抽象和它的實(shí)現(xiàn)之間有一個(gè)固定的綁定關(guān)系時(shí)。當(dāng)類的抽象以及它的實(shí)現(xiàn)都應(yīng)該可以通過生成子類的方法加以擴(kuò)充時(shí)。當(dāng)對一個(gè)抽象類的實(shí)現(xiàn)部分的修改應(yīng)對客戶不產(chǎn)生影響時(shí)。13代碼重構(gòu)與設(shè)計(jì)模式課堂實(shí)驗(yàn)徐海蛟博士實(shí)驗(yàn)五裝飾模式的應(yīng)用【實(shí)驗(yàn)?zāi)康摹?)掌握裝飾模式(Decorator)的特點(diǎn)2)分析具體問題,使用裝飾模式進(jìn)行設(shè)計(jì)?!緦?shí)驗(yàn)內(nèi)容和要求】“喜羊羊逃命”游戲:喜羊羊被灰太狼追,喜羊羊最多 5條命,灰太狼每咬到喜羊羊一次,喜羊羊就要少一條命。在逃的過程中喜羊羊可以吃到三種蘋果,吃“紅蘋果”可以給喜羊羊加上保護(hù)罩,吃“綠蘋果”可以加快喜羊羊奔跑速度,吃“黃蘋
21、果”可以使喜羊羊趟著水跑。應(yīng)用裝飾模式,用 JAVA控制臺應(yīng)用程序?qū)崿F(xiàn)該設(shè)計(jì)。繪制該模式的 UML圖。提示:這個(gè)例子如果用類的繼承來實(shí)現(xiàn)的話那可就麻煩了,你需要為喜羊羊派生 3*2*1=6個(gè)子類(有保護(hù)罩的喜羊羊,奔跑速度加快的喜羊羊,會(huì)趟水的喜羊羊,既有保護(hù)罩又會(huì)趟水的喜羊羊,奔跑速度快且會(huì)趟水的喜羊羊,有保護(hù)罩且奔跑速度快的喜羊羊,有保護(hù)罩、奔跑速度快且會(huì)趟水的喜羊羊),如果使用裝飾模式的那就不用派生諸多子類了,當(dāng)喜羊羊每吃到一個(gè)蘋果,我們就用裝飾模式給喜羊羊加一個(gè)動(dòng)態(tài)增加一個(gè)新功能即可。【模式類圖】14代碼重構(gòu)與設(shè)計(jì)模式課堂實(shí)驗(yàn)【模式代碼】publicclass DecoratorTes
22、t01 徐海蛟博士publicstaticvoid main(String args) ConcreteXiYY cxyy=new ConcreteXiYY(); ProtectXiYangyang px=new ProtectXiYangyang(); FastXiYangyang fx=new FastXiYangyang(); SwimingXiYangyang sx=new SwimingXiYangyang(); px.setXiYangyang(cxyy); px.Operation(); fx.setXiYangyang(px); fx.Operation(); sx.setXi
23、Yangyang(fx); sx.Operation(); interface XiYangyang publicvoid Operation(); class ConcreteXiYY implements XiYangyang Overridepublicvoid Operation() / TODO Autogenerated method stubSystem.out.println("喜羊羊"); abstractclass Decorator implements XiYangyang protected XiYangyang xyy; publicvoid s
24、etXiYangyang(XiYangyang xyy) this.xyy=xyy; Overridepublicvoid Operation() / TODO Autogenerated method stubxyy.Operation(); 15代碼重構(gòu)與設(shè)計(jì)模式課堂實(shí)驗(yàn)徐海蛟博士 class ProtectXiYangyang extends Decorator Overridepublicvoid Operation() / TODO Autogenerated method stubSystem.out.print(" 有保護(hù)罩的"); super.Operati
25、on(); class FastXiYangyang extends Decorator Overridepublicvoid Operation() / TODO Autogenerated method stubSystem.out.print(" 加速的"); super.Operation(); class SwimingXiYangyang extends Decorator OverridepublicvoidOperation() / TODO Autogenerated method stub System.out.print(" 會(huì)游泳的&quo
26、t;); super.Operation(); 【運(yùn)行截圖】【實(shí)驗(yàn)小結(jié)】裝飾模式的適用情況有:當(dāng)需要以不影響其他對象為前提實(shí)現(xiàn)動(dòng)態(tài)、透明地給單個(gè)對象添加職責(zé)時(shí)。當(dāng)需要將對象的某些職責(zé)進(jìn)行撤銷操作時(shí)。當(dāng)不能用生成子類的方法進(jìn)行當(dāng)前系統(tǒng)的擴(kuò)充時(shí)。16代碼重構(gòu)與設(shè)計(jì)模式課堂實(shí)驗(yàn)徐海蛟博士實(shí)驗(yàn)六代理模式的應(yīng)用【實(shí)驗(yàn)?zāi)康摹?)掌握代理模式(Proxy)的特點(diǎn)2)分析具體問題,使用代理模式進(jìn)行設(shè)計(jì)?!緦?shí)驗(yàn)內(nèi)容和要求】生產(chǎn)商(Factory)需要銷售商品(Product),網(wǎng)上商城(E-Shop)提供了一個(gè)平臺,可以幫助銷售這些商品,獲得更大的銷量。當(dāng)顧客(Custom)從網(wǎng)上商城選購商品的時(shí)候,實(shí)際是從生
27、產(chǎn)商獲得的商品。應(yīng)用代理模式,用 JAVA控制臺應(yīng)用程序改進(jìn)該設(shè)計(jì)。繪制該模式的 UML圖?!灸J経ML圖】【實(shí)驗(yàn)代碼】publicclass ProxyTest01 17代碼重構(gòu)與設(shè)計(jì)模式課堂實(shí)驗(yàn)徐海蛟博士publicstaticvoid main(String args) / TODO Autogenerated method stubE_shop es=new E_shop(); duct(); abstractclass Product publicabstractvoid product(); class Factory extends Product Overridep
28、ublicvoid product() / TODO Autogenerated method stubSystem.out.println("商品正在促銷中,滿一百減 50."); class E_shop extends Product private Factory factory; public E_shop() factory=new Factory(); Overridepublicvoid product() / TODO Autogenerated method duct(); 【運(yùn)行截圖】【實(shí)驗(yàn)小結(jié)】代理模式的有以下幾種適用情
29、況:當(dāng)需要為一個(gè)對象在不同的地址空間提供局部的代表時(shí)。當(dāng)需要?jiǎng)?chuàng)建開銷非常大的對象時(shí)。當(dāng)需要控制原始對象的訪問時(shí)。當(dāng)需要再訪問對象時(shí)執(zhí)行一些附加操作時(shí),比如通過代理對象計(jì)算訪問實(shí)際對象的次數(shù)。18代碼重構(gòu)與設(shè)計(jì)模式課堂實(shí)驗(yàn)徐海蛟博士實(shí)驗(yàn)七觀察者模式的應(yīng)用【實(shí)驗(yàn)?zāi)康摹?)掌握外觀模式(Observer)的特點(diǎn)2)分析具體問題,使用外觀模式進(jìn)行設(shè)計(jì)?!緦?shí)驗(yàn)內(nèi)容和要求】網(wǎng)上商店中如果商品(product)在名稱(name)、價(jià)格(price)等方面有變化,系統(tǒng)能自動(dòng)通知會(huì)員,將是網(wǎng)上商店區(qū)別傳統(tǒng)商店的一大特色。如何設(shè)計(jì)實(shí)現(xiàn)?說明你所選擇的設(shè)計(jì)模式,畫出類關(guān)系圖并指明各個(gè)類的角色。應(yīng)用外觀模式,用 JA
30、VA控制臺應(yīng)用程序改進(jìn)該設(shè)計(jì)。繪制該模式的 UML圖。【模式 UML 圖】【模式代碼】import java.util.ArrayList; publicclass ObeserverTest publicstaticvoid main(String args) / TODO Autogenerated method stubConcreteSubject cs=new ConcreteSubject(); cs.Attach(new ConcreteObserver(cs, "1號會(huì)員"); cs.Attach(new ConcreteObserver(cs, "
31、;2號會(huì)員"); cs.Attach(new ConcreteObserver(cs, "3號會(huì)員"); cs.Attach(new ConcreteObserver(cs, "4號會(huì)員"); cs.setState("C+編程思想價(jià)錢下降 100元"); 19代碼重構(gòu)與設(shè)計(jì)模式課堂實(shí)驗(yàn)徐海蛟博士cs.Notify(); abstractclass Observer publicabstractvoid update(); class ConcreteObserver extends Observer private Str
32、ing name; private String state; privateConcreteSubject cs; public ConcreteSubject getConcreteSubject() returncs; publicvoid setConcreteSubject(ConcreteSubject cs) this.cs=cs; public ConcreteObserver(ConcreteSubject cs,String name) this.cs=cs; =name; Overridepublicvoid update() / TODO Autoge
33、nerated method stubstate=cs.getState(); System.out.println(name+"觀察到的狀態(tài)是:"+state); abstractclass Subject private ArrayList<Observer> observers=new ArrayList<Observer>(); publicvoid Attach(Observer o) observers.add(o); publicvoid Detach(Observer o) observers.remove(o); /通知public
34、void Notify() for (int i = 0; i < observers.size(); i+) observers.get(i).update(); 20代碼重構(gòu)與設(shè)計(jì)模式課堂實(shí)驗(yàn)徐海蛟博士class ConcreteSubject extends Subject private String state; publicvoid setState(String state) this.state=state; publicString getState() returnstate; 【運(yùn)行截圖】【實(shí)驗(yàn)小結(jié)】觀察者模式的適用情況有:當(dāng)一個(gè)抽象模型有兩個(gè)方面,而其中一個(gè)方面必
35、須依賴于另一個(gè)方面時(shí)。當(dāng)對一個(gè)對象的改變需要同時(shí)改變其他對象但是卻不知道具體有多少個(gè)對象等到改變時(shí)。當(dāng)一個(gè)對象必須通知其他對象但是卻不能與其他對象造成緊密耦合時(shí)。21代碼重構(gòu)與設(shè)計(jì)模式課堂實(shí)驗(yàn)徐海蛟博士實(shí)驗(yàn)八職責(zé)鏈模式的應(yīng)用【實(shí)驗(yàn)?zāi)康摹?)掌握職責(zé)鏈模式(Chain of Responsibility)的特點(diǎn)2)分析具體問題,使用職責(zé)鏈模式進(jìn)行設(shè)計(jì)?!緦?shí)驗(yàn)內(nèi)容和要求】高校學(xué)生請假需要符合學(xué)校規(guī)定,假如班主任可以批準(zhǔn) 1天假,系主任可以批準(zhǔn) 7天假,各學(xué)院院長可以批準(zhǔn) 30天,學(xué)校校長可以批準(zhǔn) 1年。應(yīng)用職責(zé)鏈模式,用 JAVA控制臺應(yīng)用程序?qū)崿F(xiàn)該設(shè)計(jì)。繪制該模式的 UML圖?!灸J経ML圖】【
36、模式代碼】publicclass StudentClient publicstaticvoid main(String args) / TODO Autogenerated method stubHandler fdy=new FuDaoYuan(); Handler xzr=new XiZhuRen(); Handler xy=new XueYuan(); Handler xx=new XueXiao(); fdy.setSuccessor(xzr); xzr.setSuccessor(xy); xy.setSuccessor(xx); for (int i = 1; i < 20;
37、i+=2) fdy.handleRequest(i); 22代碼重構(gòu)與設(shè)計(jì)模式課堂實(shí)驗(yàn)徐海蛟博士 /處理請求的接口abstractclass Handler protected Handler successor; publicvoid setSuccessor(Handler successor) this.successor=successor; publicabstractvoid handleRequest(int request); classFuDaoYuan extends Handler Overridepublicvoid handleRequest(int request)
38、 / TODO Autogenerated method stubif(request<=1) System.out.println(this.getClass().getSimpleName()+"處理了請求"+request); else if(this.successor!=null) System.out.println(this.getClass().getSimpleName()+"自身無法滿足請求,轉(zhuǎn)入下一個(gè)處理者"); this.successor.handleRequest(request); class XiZhuRen ext
39、ends Handler Overridepublicvoid handleRequest(int request) / TODO Autogenerated method stubif(request<=7) System.out.println(this.getClass().getSimpleName()+"處理了請求"+request); else if(this.successor!=null) System.out.println(this.getClass().getSimpleName()+"自身無法滿足請求,轉(zhuǎn)入下一個(gè)處理者");
40、 this.successor.handleRequest(request); 23代碼重構(gòu)與設(shè)計(jì)模式課堂實(shí)驗(yàn) class XueYuan extends Handler 徐海蛟博士Overridepublicvoid handleRequest(int request) / TODO Autogenerated method stubif(request<=9) System.out.println(this.getClass().getSimpleName()+"處理了請求"+request); else if(this.successor!=null) Syst
41、em.out.println(this.getClass().getSimpleName()+"自身無法滿足請求,轉(zhuǎn)入下一個(gè)處理者"); this.successor.handleRequest(request); class XueXiao extends Handler OverridepublicvoidhandleRequest(int request) / TODO Autogenerated method stubif(request<=15) System.out.println(this.getClass().getSimpleName()+"
42、;處理了請求"+request); else System.out.println("該生請假時(shí)間太長,不能批準(zhǔn)"); 【運(yùn)行截圖】FuDaoYuan處理了請求 1 FuDaoYuan自身無法滿足請求,轉(zhuǎn)入下一個(gè)處理者XiZhuRen處理了請求 3 FuDaoYuan自身無法滿足請求,轉(zhuǎn)入下一個(gè)處理者XiZhuRen處理了請求 5 FuDaoYuan自身無法滿足請求,轉(zhuǎn)入下一個(gè)處理者XiZhuRen處理了請求 7 FuDaoYuan自身無法滿足請求,轉(zhuǎn)入下一個(gè)處理者24代碼重構(gòu)與設(shè)計(jì)模式課堂實(shí)驗(yàn)徐海蛟博士XiZhuRen自身無法滿足請求,轉(zhuǎn)入下一個(gè)處理者XueYu
43、an處理了請求 9 FuDaoYuan自身無法滿足請求,轉(zhuǎn)入下一個(gè)處理者XiZhuRen自身無法滿足請求,轉(zhuǎn)入下一個(gè)處理者XueYuan自身無法滿足請求,轉(zhuǎn)入下一個(gè)處理者XueXiao處理了請求 11 FuDaoYuan自身無法滿足請求,轉(zhuǎn)入下一個(gè)處理者XiZhuRen自身無法滿足請求,轉(zhuǎn)入下一個(gè)處理者XueYuan自身無法滿足請求,轉(zhuǎn)入下一個(gè)處理者XueXiao處理了請求 13 FuDaoYuan自身無法滿足請求,轉(zhuǎn)入下一個(gè)處理者XiZhuRen自身無法滿足請求,轉(zhuǎn)入下一個(gè)處理者XueYuan自身無法滿足請求,轉(zhuǎn)入下一個(gè)處理者XueXiao處理了請求 15 FuDaoYuan自身無法滿足請求
44、,轉(zhuǎn)入下一個(gè)處理者XiZhuRen自身無法滿足請求,轉(zhuǎn)入下一個(gè)處理者XueYuan自身無法滿足請求,轉(zhuǎn)入下一個(gè)處理者該生請假時(shí)間太長,不能批準(zhǔn)FuDaoYuan自身無法滿足請求,轉(zhuǎn)入下一個(gè)處理者XiZhuRen自身無法滿足請求,轉(zhuǎn)入下一個(gè)處理者XueYuan自身無法滿足請求,轉(zhuǎn)入下一個(gè)處理者該生請假時(shí)間太長,不能批準(zhǔn)【實(shí)驗(yàn)小結(jié)】職責(zé)鏈模式主要適用于以下情況:當(dāng)有多個(gè)對象可以處理同一個(gè)請求,而具體哪個(gè)對象來處理這個(gè)請求在運(yùn)行時(shí)刻需要自動(dòng)判定時(shí)。當(dāng)需要在不明確接受者的情況下向多個(gè)對象中的某一個(gè)提交請求時(shí)。當(dāng)處理一個(gè)請求的對象集合應(yīng)該動(dòng)態(tài)地被確定時(shí)。25代碼重構(gòu)與設(shè)計(jì)模式課堂實(shí)驗(yàn)徐海蛟博士實(shí)驗(yàn)九訪問
45、者模式的應(yīng)用【實(shí)驗(yàn)?zāi)康摹?)掌握訪問者模式(Visitor)的特點(diǎn)2)分析具體問題,使用訪問者模式進(jìn)行設(shè)計(jì)?!緦?shí)驗(yàn)內(nèi)容和要求】超市中有兩類商品,蘋果(Apple)和巧克力(Chocolate),顧客(Custom)將所選商品放在購物車中(Shopping Cart),然后到收銀員(Cashier)處付款。在購物過程中,顧客需要對這些商品進(jìn)行訪問,以便確認(rèn)這些商品的質(zhì)量,之后收銀員也需要訪問購物車內(nèi)的商品,以便計(jì)算價(jià)格。應(yīng)用訪問者模式,用 JAVA控制臺應(yīng)用程序?qū)崿F(xiàn)該設(shè)計(jì)。繪制該模式的 UML圖。【模式UML圖】26代碼重構(gòu)與設(shè)計(jì)模式課堂實(shí)驗(yàn)【模式代碼】import java.util.Arra
46、yList; import java.util.List; public class ShoppingTest 徐海蛟博士/* * param args */ public static void main(String args) / TODO Autogenerated method stub ShoppingCart sc=new ShoppingCart(); sc.Attach(new Apple("Apple"); sc.Attach(new Chocolate("Chocolate"); PersonVisitor pv=new Custo
47、mer(); sc.accept(pv); PersonVisitor ps=new Cashier(); sc.accept(ps); abstract class PersonVisitor public abstract void visitorApple(Apple apple); public abstract void visitorChocolate(Chocolate chocolate); class Customer extends PersonVisitor Override public void visitorApple(Apple apple) / TODO Aut
48、ogenerated method stub System.out.println(this.getClass().getSimpleName()+" 選購"+apple.getName(); Override public void visitorChocolate(Chocolate chocolate) / TODO Autogenerated method stub System.out.println(this.getClass().getSimpleName()+" 選購"+chocolate.getName(); class Cashier
49、 extends PersonVisitor 27代碼重構(gòu)與設(shè)計(jì)模式課堂實(shí)驗(yàn)徐海蛟博士Override public void visitorApple(Apple apple) / TODO Autogenerated method stub System.out.println(this.getClass().getSimpleName()+" 對"+apple.getName()+" 收銀"); Override public void visitorChocolate(Chocolate chocolate) / TODO Autogenerat
50、ed method stub System.out.println(this.getClass().getSimpleName()+" 對"+chocolate.getName()+" 收銀"); abstract class Shop protected String name; public Shop(String name) =name; public abstract void accpet(PersonVisitor pv); public String getName() return name; class Apple e
51、xtends Shop public Apple(String name) super(name); / TODO Autogenerated constructor stub Override public void accpet(PersonVisitor pv) / TODO Autogenerated method stub pv.visitorApple(this); class Chocolate extends Shop 28代碼重構(gòu)與設(shè)計(jì)模式課堂實(shí)驗(yàn)徐海蛟博士public Chocolate(String name) super(name); / TODO Autogenera
52、ted constructor stub Override public void accpet(PersonVisitor pv) / TODO Autogenerated method stub pv.visitorChocolate(this); class ShoppingCart List<Shop> shops=new ArrayList<Shop>(); public void Attach(Shop shop) shops.add(shop); public void Detach(Shop shop) shops.remove(shop); public void accept(PersonVisitor visitor) for (int i = 0
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度LED節(jié)能燈具采購與安裝一體化合同范本3篇
- 二零二五年度木材加工設(shè)備租賃合同樣本2篇
- 二零二五年度農(nóng)機(jī)行業(yè)人才引進(jìn)與培養(yǎng)合同4篇
- 二零二五年度大摩退出中金項(xiàng)目合同終止倒計(jì)時(shí)通知2篇
- 2025年度南京家庭裝修工程竣工驗(yàn)收備案合同4篇
- 2025年度個(gè)人光伏發(fā)電貸款擔(dān)保合同3篇
- 2025版文化娛樂場所租賃及活動(dòng)策劃服務(wù)合同模板4篇
- 2025版儲罐泄漏檢測與預(yù)防措施合同范本3篇
- 2025版農(nóng)民合作社農(nóng)村農(nóng)村電商扶貧項(xiàng)目融資合同3篇
- 二零二五年度拋光設(shè)備生產(chǎn)與銷售合作合同4篇
- 《裝配式蒸壓加氣混凝土外墻板保溫系統(tǒng)構(gòu)造》中
- T-CSTM 01124-2024 油氣管道工程用工廠預(yù)制袖管三通
- 2019版新人教版高中英語必修+選擇性必修共7冊詞匯表匯總(帶音標(biāo))
- 新譯林版高中英語必修二全冊短語匯總
- 基于自適應(yīng)神經(jīng)網(wǎng)絡(luò)模糊推理系統(tǒng)的游客規(guī)模預(yù)測研究
- 河道保潔服務(wù)投標(biāo)方案(完整技術(shù)標(biāo))
- 品管圈(QCC)案例-縮短接臺手術(shù)送手術(shù)時(shí)間
- 精神科病程記錄
- 閱讀理解特訓(xùn)卷-英語四年級上冊譯林版三起含答案
- 清華大學(xué)考博英語歷年真題詳解
- 人教版三年級上冊口算題(全冊完整20份 )
評論
0/150
提交評論