版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、代碼重構(gòu)與設(shè)計(jì)模式課堂實(shí)驗(yàn)徐海蛟博士 2016.033230 / 33實(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ì),用控制臺(tái)應(yīng) 用程序?qū)崿F(xiàn)該OEM制造商的工廠模式。該模式的 UML圖如下?!灸J経ML圖】止C Mint IF*0 fevlA【模式代碼(JAVA語言實(shí)現(xiàn))】public c
2、lass FactoryMethod / 主類public static void main(String口 args) Computer c;Factory f =newc = f.getComputerType();c.ComputerType();f = new LenovoFactory();11 / 33 c = f.getComputerType();c.ComputerType();f = new AcerFactory();c = f.getComputerType();c.ComputerType();interface FactoryComputer getComputer
3、Type();class DellFactory implements FactoryOverridepublic Computer getComputerType() return new Dell();class AcerFactory implements FactoryOverridepublic Computer getComputerType() return new Acer();class LenovoFactory implements FactoryOverridepublic Computer getComputerType() return new Lenovo();/
4、*電腦品牌*/interface Computerpublic void ComputerType();class Dell implements ComputerOverridepublic void ComputerType() / TODO Auto - generated method stubSystem. out .println( "Dell Computer" ); class Acer implements ComputerOverridepublic void ComputerType() System. out .println( "Acer
5、 Computer" );class Lenovo implements ComputerOverride public void ComputerType() / TODO Auto - generated method stub System. out .println( "Lenovo Computer" );【運(yùn)行截圖】Dell ComputerLenovo ComputerAcer Comptiter|【實(shí)驗(yàn)小結(jié)】通過本次實(shí)驗(yàn),學(xué)會(huì)了使用工廠方法模式。工廠方法模式的適用性如下: 當(dāng)一個(gè)類不知道它所必須創(chuàng)建的對(duì)象的類時(shí)。當(dāng)一個(gè)類希望由它的子類來指定它所創(chuàng)建
6、的對(duì)象時(shí)。當(dāng)類將創(chuàng)建對(duì)象的職責(zé)委托給多個(gè)幫助子類中的某一個(gè),并且希望將哪 一個(gè)幫助子類是代理這一信息局部化時(shí)。實(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)和肯彳t基(KFC)快餐店都經(jīng)營漢堡(Hamburg)和 可樂(Cola),用JAVA控制臺(tái)應(yīng)用程序?qū)崿F(xiàn)這兩個(gè)快餐店經(jīng)營產(chǎn)品的抽象工廠 模式。該模式的UML圖如下?!灸J経ML圖】【模式代碼】public class AbstractFactoryTest public static void mai
7、n(String口 args) Hamburg h;Cola c;AbstractFactory af =new MDNFactory(); h = af.createHamburg();c = af.createCola();h.getHumburg();c.getCola();af = new KDJFactory();h = af.createHamburg();c = af.createCola();h.getHumburg();c.getCola(); interface AbstractFactoryHamburg createHamburg();Cola createCola()
8、;class MDNFactory implements AbstractFactory Overridepublic Hamburg createHamburg() return new MDNHamburg();Overridepublic Cola createCola() return new MDNCola();class KDJFactory implements AbstractFactory Overridepublic Hamburg createHamburg() return new KDJHamburg();Overridepublic Cola createCola(
9、) return new KDJCola();/* kDJ & MDN*/interface Hamburgvoid getHumburg(); class MDNHamburg implements Hamburg Override public void getHumburg() System. out .println( "MDNHamburg"); class KDJHamburg implements Hamburg Override public void getHumburg() / TODO Auto - generated method stubS
10、ystem. out .println( interface Colavoid getCola();class MDNCola implements Overridepublic void getCola() System. out .println(class KDJCola implementsOverridepublic void getCola() System. out .println(【運(yùn)行截圖】MDNHamburg MDNColaKDJHamburg KDColal"KDJHamburg");Cola"MDNCola");Cola&quo
11、t;KDJCola");【實(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)品對(duì)象的設(shè)計(jì)以便進(jìn)行聯(lián)合使用時(shí)。當(dāng)要提供一個(gè)產(chǎn)品類庫,而只要顯示它們的接口而不是實(shí)現(xiàn)時(shí)實(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ì)了圓對(duì)象 (Circle)、矩形對(duì)象(Rectangle), 線對(duì)象(Line)都支持Draw()函數(shù),即可以通過 Draw()函數(shù)繪制圖形。為了加快項(xiàng) 目進(jìn)
12、度,將角度對(duì)象(Angle)繪制功能交給了合作團(tuán)隊(duì)實(shí)現(xiàn)。但合作團(tuán)隊(duì)將角度 對(duì)象繪制函數(shù)定為了 DrawAngle()。繪圖系統(tǒng)提供給用戶后,用戶不滿意,希望 能統(tǒng)一的調(diào)用,不用記太多命令。應(yīng)用適配器模式,用 JAVA控制臺(tái)應(yīng)用程序完 善該設(shè)計(jì)。該模式的 UML圖如下。【模式UMI®】Client【模式代碼】public class AdapterTest public static void main(String口 args) Paint a = new AngleAdapter();a.draw();interface Paint void draw();class Circle
13、 implements Paint Override public void draw() System. out .println( "圓圓");class Rectangle implements PaintOverride public void draw() System. out .println( "方方");class Line implements PaintOverride public void draw() System. out .println( "線線"); class Angle public void
14、DrawAngle()System. out .println( "角度");class AngleAdapter implements Paint private Angle a=new Angle(); Override public void draw() / TODO Auto - generated method stub a.DrawAngle();【運(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)需要使用一個(gè)
15、已經(jīng)存在的子類,但是不可能對(duì)所有的都進(jìn)行子類化以匹配 他們的接口時(shí),對(duì)象適配器可以對(duì)其父類接口進(jì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),提供給用戶不同口味的組合,如大 杯咖啡加牛奶,中杯咖啡加糖,小杯咖啡加檸檬,小杯咖啡加糖等。應(yīng)用橋接模 式,用JAVA控制
16、臺(tái)應(yīng)用程序?qū)崿F(xiàn)該設(shè)計(jì)。該模式的 UML圖如下?!灸J筋悎D】I.+tFr.f f a*fj依紀(jì)工*Ctt*1 口 0 ' nidi* 釬it 城&,J 11 fi ' ftllLwuL ?【模式代碼】package Constructor;public class BridgeTest public static void main(String口 args) Bridge b; | b=new Sugar();b.setCoffee( new JorumCoffee();b.getCoffee();b=new Milk();b.setCoffee( new SmallC
17、offee(); b.getCoffee();interface Coffeevoid getCoffee();class JorumCoffee implements CoffeeOverridepublic void getCoffee() / TODO Auto - generated method stub System. out .print("大杯咖啡");class MediumCoffee implements CoffeeOverridepublic void getCoffee() / TODO Auto - generated method stub
18、System. out .print( "中杯咖啡");class SmallCoffee implements CoffeeOverridepublic void getCoffee() / TODO Auto - generated method stub System. out .print("小杯咖啡");/*配料*/abstract class Bridgeprotected Coffee c;void setCoffee(Coffee co) c=co;public void getCoffee() c.getCoffee();class S
19、ugar extends BridgeOverridepublic void getCoffee()c.getCoffee();System. out .println( "加糖");class Milkextends BridgeOverridepublicvoid getCoffee()c.getCoffee();System. out .println( "加牛奶");class Lemon extends BridgeOverridepublic void getCoffee()c.getCoffee();System. out .println
20、( "加檸檬");【運(yùn)行截圖】大杯咖啡加糖小杯咖啡加牛奶|【實(shí)驗(yàn)小結(jié)】橋接模式的適用情況有:當(dāng)不希望在抽象和它的實(shí)現(xiàn)之間有一個(gè)固定的綁定關(guān)系時(shí)。當(dāng)類的抽象以及它的實(shí)現(xiàn)都應(yīng)該可以通過生成子類的方法加以擴(kuò)充時(shí) 當(dāng)對(duì)一個(gè)抽象類的實(shí)現(xiàn)部分的修改應(yīng)對(duì)客戶不產(chǎn)生影響時(shí)。實(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控制臺(tái)應(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è)新功能即可?!灸J筋悎D】:T -:T XVY -J:. :*5. £?
22、mi 口 i voliz!Ir Xi T iiinisy w十 Cipci Jl Lufti J I. J: Void.Evlal ilz.H. T ang VQ.Tug* Opera 11 anitS IX【模式代碼】public class DecoratorTestOI public static void main(String口 args) ConcreteXiYY cxyy=new ConcreteXiYY();ProtectXiYangyang px= ,new ProtectXiYangyang(); FastXiYangyang fx=new FastXiYangyang()
23、;SwimingXiYangyang sx= new SwimingXiYangyang(); px.setXiYangyang(cxyy);px.Operation();fx.setXiYangyang(px); fx.Operation();sx.setXiYangyang(fx); sx.Operation();interface XiYangyang public void Operation。;class ConcreteXiYY implements XiYangyangOverridepublicvoid Operation。/TODO Auto - generated meth
24、od stubSystem. out .println("喜羊羊");abstract class Decorator implements XiYangyang protected XiYangyang xyy; public void setXiYangyang(XiYangyang xyy)this . xyy =xyy;Overridepublicvoid Operation() /TODO Auto - generated method stubxyy .Operation。;class ProtectXiYangyang extends Decorator Ov
25、erridepublic void Operation。/ TODO Auto - generated method stub System. out .print( "有保護(hù)罩的"); super .Operation。;class FastXiYangyang extends Decorator Overridepublic void Operation。/ TODO Auto - generated method stub System. out .print( "加速的");super .Operation。;class SwimingXiYan
26、gyang extends Decorator Overridepublic void Operation() / TODO Auto - generated method stub System. out .print( "會(huì)游泳的"); super .Operation。;【運(yùn)行截圖】有保護(hù)罩的喜羊羊加速的有保護(hù)罩的喜羊羊會(huì)游泳的加速的有保護(hù)量的喜羊羊【實(shí)驗(yàn)小結(jié)】裝飾模式的適用情況有:當(dāng)需要以不影響其他對(duì)象為前提實(shí)現(xiàn)動(dòng)態(tài)、透明地給單個(gè)對(duì)象添加職責(zé)時(shí)當(dāng)需要將對(duì)象的某些職責(zé)進(jìn)行撤銷操作時(shí)。當(dāng)不能用生成子類的方法進(jìn)行當(dāng)前系統(tǒng)的擴(kuò)充時(shí)。實(shí)驗(yàn)六代理模式的應(yīng)用【實(shí)驗(yàn)?zāi)康摹?)掌握代
27、理模式(Proxy)的特點(diǎn)2)分析具體問題,使用代理模式進(jìn)行設(shè)計(jì)?!緦?shí)驗(yàn)內(nèi)容和要求】生產(chǎn)商(Factory)需要銷售商品(Product),網(wǎng)上商城(E-Shop提供了一個(gè)平臺(tái), 可以幫助銷售這些商品,獲得更大的銷量。當(dāng)顧客(Custom)從網(wǎng)上商城選購商品的時(shí)候,實(shí)際是從生產(chǎn)商獲得的商品。應(yīng)用代理模式,用 JAVA控制臺(tái)應(yīng)用程序 改進(jìn)該設(shè)計(jì)。繪制該模式的 UML圖?!灸J経MI®】【實(shí)驗(yàn)代碼】public class ProxyTestOI public/static void main(String口 args) TODO Auto - generated method stub
28、E_shop es= new E_shop();duct();abstract class Product public abstract void product。;class Factory extends ProductOverride public void product。/ TODO Auto - generated method stubSystem. out .println( "商品正在促銷中,滿一百減50."); class E_shop extends Product private Factory factory ; public E_s
29、hop()factory =new Factory。; Override public void product() / TODO Auto - generated method stub factory .product。;【運(yùn)行截圖】商品正在促銷中,滿一百械50.【實(shí)驗(yàn)小結(jié)】代理模式的有以下幾種適用情況:當(dāng)需要為一個(gè)對(duì)象在不同的地址空間提供局部的代表時(shí)。當(dāng)需要?jiǎng)?chuàng)建開銷非常大的對(duì)象時(shí)。當(dāng)需要控制原始對(duì)象的訪問時(shí)。當(dāng)需要再訪問對(duì)象時(shí)執(zhí)行一些附加操作時(shí),比如通過代理對(duì)象計(jì)算訪問實(shí)際 對(duì)象的次數(shù)。實(shí)驗(yàn)七觀察者模式的應(yīng)用【實(shí)驗(yàn)?zāi)康摹?)掌握外觀模式(Observe。的特點(diǎn)2)分析具體問題,使用外觀模
30、式進(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)用外觀 模式,用JAVA控制臺(tái)應(yīng)用程序改進(jìn)該設(shè)計(jì)。繪制該模式的UML圖。【模式UML圖】【模式代碼】import java.util.ArrayList;public class ObeserverTest public static void main(String口 args) / TODO Auto - generated method st
31、ub cs.Notify();ConcreteSubject cs=new ConcreteSubject();cs.Attach( cs.Attach( cs.Attach( cs.Attach( cs.setState(new ConcreteObserver(cs, new ConcreteObserver(cs, new ConcreteObserver(cs, new ConcreteObserver(cs,"C+編程思想價(jià)錢下降"1號(hào)會(huì)員");"2號(hào)會(huì)員");"3號(hào)會(huì)員");“4號(hào)會(huì)員");100 元”
32、);abstract class Observerpublic abstract void update();class ConcreteObserver extends ObserverprivateStringname;privateStringstate ;private ConcreteSubject cs;public ConcreteSubject getConcreteSubject() return cs;public void setConcreteSubject(ConcreteSubject cs) this . cs =cs;public ConcreteObserve
33、r(ConcreteSubject cs,String name) this . cs =cs;this . name=name;Overridepublicvoid update() / TODO Auto - generated method stub state =cs .getState();System. out .println( name+"觀察到的狀態(tài)是:"+state );abstract class Subjectprivate ArrayList<Observer> observers =new ArrayList<Observer&
34、gt;();public void Attach(Observer o) observers .add(o);public void Detach(Observer o) observers .remove(o);/通知public void Notify()for ( int i = 0; i < observers .size(); i+) observers .get(i).update(); class ConcreteSubject extends Subjectprivate String state ;public void setState(String state)th
35、is . state =state;public String getState() return state ;【運(yùn)行截圖】1號(hào)會(huì)員觀察到的狀態(tài)是:C+編程思想價(jià)錢下降元 2號(hào)會(huì)員觀察到的狀態(tài)是:C+編程思想價(jià)錢下降白元 3號(hào)會(huì)員觀察到的狀態(tài)是:C+編程思想價(jià)錢下降T80元 4號(hào)會(huì)員觀察到的狀態(tài)是;C+編程除意價(jià)錢下降1。0元【實(shí)驗(yàn)小結(jié)】觀察者模式的適用情況有:當(dāng)一個(gè)抽象模型有兩個(gè)方面,而其中一個(gè)方面必須依賴于另一個(gè)方面時(shí)。當(dāng)對(duì)一個(gè)對(duì)象的改變需要同時(shí)改變其他對(duì)象但是卻不知道具體有多少個(gè)對(duì) 象等到改變時(shí)。當(dāng)一個(gè)對(duì)象必須通知其他對(duì)象但是卻不能與其他對(duì)象造成緊密耦合時(shí)。實(shí)驗(yàn)八職責(zé)鏈模式的應(yīng)用【實(shí)驗(yàn)
36、目的】1)掌握職責(zé)鏈模式(Chain of Responsibility)的特點(diǎn)2)分析具體問題,使用職責(zé)鏈模式進(jìn)行設(shè)計(jì)?!緦?shí)驗(yàn)內(nèi)容和要求】高校學(xué)生請(qǐng)假需要符合學(xué)校規(guī)定,假如班主任可以批準(zhǔn)1天假,系主任可以批準(zhǔn)7天假,各學(xué)院院長可以批準(zhǔn) 30天,學(xué)校校長可以批準(zhǔn)1年。應(yīng)用職責(zé)鏈 模式,用JAVA控制臺(tái)應(yīng)用程序?qū)崿F(xiàn)該設(shè)計(jì)。繪制該模式的UML圖?!灸J経MI®】口litEtricilMLiocMgiair : Handler-t twJL 亡艮亡 qurmt 0: v&i d心.知中ut 舊 veld【模式代碼】public class StudentClient public
37、static void main(String口 args) / TODO Auto - generated method stub Handler 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; i+=2) fdy.handleRequest(i);/處理請(qǐng)求的接口a
38、bstract class Handlerprotected Handler successor ;public void setSuccessor(Handler successor) this . successor =successor;public abstract void handleRequest( int request);class FuDaoYuan extends HandlerOverridepublic void handleRequest( int request) / TODO Auto - generated method stub if (request<
39、;=1)System. out .println( this .getClass().getSimpleName()+ 求"+request); else if (this . successor != null )System. out .println( this .getClass().getSimpleName()+ 無法滿足請(qǐng)求,轉(zhuǎn)入下一個(gè)處理者”);this . successor .handleRequest(request);class XiZhuRen extends HandlerOverridepublic void handleRequest( int req
40、uest) / TODO Auto - generated method stub if (request<=7)System. out .println( this .getClass().getSimpleName()+ 求"+request); else if (this . successor != null )System. out .println( this .getClass().getSimpleName()+ 無法滿足請(qǐng)求,轉(zhuǎn)入下一個(gè)處理者”);this . successor .handleRequest(request); 處理了請(qǐng)"自身處理了
41、請(qǐng)"自身class XueYuan extends HandlerOverridepublic void handleRequest( int request) / TODO Auto - generated method stub if (request<=9)System. out .println( this .getClass().getSimpleName()+ "處理了請(qǐng) 求"+request); else if (this . successor != null )System. out .println( this .getClass().g
42、etSimpleName()+"自身無法滿足請(qǐng)求,轉(zhuǎn)入下一個(gè)處理者”);this . successor .handleRequest(request);class XueXiao extends HandlerOverridepublic void handleRequest( int request) / TODO Auto - generated method stub if (request<=15)System. out .println( this .getClass().getSimpleName()+ "處理了請(qǐng) 求"+request); e
43、lse System. out .println( "該生請(qǐng)假時(shí)間太長,不能批準(zhǔn) ");【運(yùn)行截圖】FuDaoYuan處理了請(qǐng)求1FuDaoYuan自身無法滿足請(qǐng)求,轉(zhuǎn)入下一個(gè)處理者XiZhuRen 處理了請(qǐng)求3FuDaoYuan自身無法滿足請(qǐng)求,轉(zhuǎn)入下一個(gè)處理者XiZhuRen 處理了請(qǐng)求5FuDaoYuan自身無法滿足請(qǐng)求,轉(zhuǎn)入下一個(gè)處理者XiZhuRen 處理了請(qǐng)求7FuDaoYuan自身無法滿足請(qǐng)求,轉(zhuǎn)入下一個(gè)處理者XiZhuRen自身無法滿足請(qǐng)求,轉(zhuǎn)入下一個(gè)處理者XueYuan處理了請(qǐng)求9FuDaoYuan自身無法滿足請(qǐng)求,轉(zhuǎn)入下一個(gè)處理者XiZhuRen自身無法
44、滿足請(qǐng)求,轉(zhuǎn)入下一個(gè)處理者XueYuan自身無法滿足請(qǐng)求,轉(zhuǎn)入下一個(gè)處理者XueXiao 處理了請(qǐng)求11FuDaoYuan自身無法滿足請(qǐng)求,轉(zhuǎn)入下一個(gè)處理者XiZhuRen自身無法滿足請(qǐng)求,轉(zhuǎn)入下一個(gè)處理者XueYuan自身無法滿足請(qǐng)求,轉(zhuǎn)入下一個(gè)處理者XueXiao 處理了請(qǐng)求13FuDaoYuan自身無法滿足請(qǐng)求,轉(zhuǎn)入下一個(gè)處理者XiZhuRen自身無法滿足請(qǐng)求,轉(zhuǎn)入下一個(gè)處理者XueYuan自身無法滿足請(qǐng)求,轉(zhuǎn)入下一個(gè)處理者XueXiao 處理了請(qǐng)求15FuDaoYuan自身無法滿足請(qǐng)求,轉(zhuǎn)入下一個(gè)處理者XiZhuRen自身無法滿足請(qǐng)求,轉(zhuǎn)入下一個(gè)處理者XueYuan自身無法滿足請(qǐng)求,轉(zhuǎn)
45、入下一個(gè)處理者該生請(qǐng)假時(shí)間太長,不能批準(zhǔn)FuDaoYuan自身無法滿足請(qǐng)求,轉(zhuǎn)入下一個(gè)處理者XiZhuRen自身無法滿足請(qǐng)求,轉(zhuǎn)入下一個(gè)處理者XueYuan自身無法滿足請(qǐng)求,轉(zhuǎn)入下一個(gè)處理者該生請(qǐng)假時(shí)間太長,不能批準(zhǔn)【實(shí)驗(yàn)小結(jié)】職責(zé)鏈模式主要適用于以下情況:當(dāng)有多個(gè)對(duì)象可以處理同一個(gè)請(qǐng)求,而具體哪個(gè)對(duì)象來處理這個(gè)請(qǐng)求在運(yùn)行 時(shí)刻需要自動(dòng)判定時(shí)。當(dāng)需要在不明確接受者的情況下向多個(gè)對(duì)象中的某一個(gè)提交請(qǐng)求時(shí)。當(dāng)處理一個(gè)請(qǐng)求的對(duì)象集合應(yīng)該動(dòng)態(tài)地被確定時(shí)。實(shí)驗(yàn)九訪問者模式的應(yīng)用【實(shí)驗(yàn)?zāi)康摹?)掌握訪問者模式(Visitor)的特點(diǎn)2)分析具體問題,使用訪問者模式進(jìn)行設(shè)計(jì)【實(shí)驗(yàn)內(nèi)容和要求】超市中有兩類商品
46、,蘋果(Apple)和巧克力(Chocolate),顧客(Custom)將所選商品放在購物車中(Shopping Cart),然后到收銀員(Cashier)處付款。在購物過程中,顧客需要對(duì)這些商品進(jìn)行訪問,以便確認(rèn)這些商品的質(zhì)量,之后收銀員也需要訪問購物車內(nèi)的商品,以便計(jì)算價(jià)格。應(yīng)用訪問者模式,用 JAVA控制臺(tái)應(yīng)用程序?qū)崿F(xiàn)該設(shè)計(jì)。繪制該模式的UML圖?!灸J酱a】import java.util.ArrayList;import java.util.List; public class ShoppingTest /* param args */public static void main(
47、String args) / TODO Auto - generated method stubShoppingCart sc=new ShoppingCart();sc.Attach(new Apple("Apple");sc.Attach(new Chocolate("Chocolate");PersonVisitor pv=new Customer。;sc.accept(pv);PersonVisitor ps=new Cashier();sc.accept(ps); abstract class PersonVisitorpublic abstr
48、act void visitorApple(Apple apple);public abstract void visitorChoc01ate(Chocolate chocolate); class Customer extends PersonVisitorOverride public void visitorApple(Apple apple) / TO DO Auto - generated method stub System.out.println(this.getClass().getSimpleName()+"選購"+apple.getName();Ove
49、rride public void visitorChocolate(Chocolate chocolate) / TODO Auto - generated method stub System.out.println(this.getClass().getSimpleName()+"選購"+chocolate.getName(); class Cashier extends PersonVisitorOverridepublic void visitorApple(Apple apple) / TODO Auto - generated method stubSyste
50、m.out.println(this.getClass().getSimpleName()+"對(duì)"+apple.getName()+" 收銀");Overridepublic void visitorChoc01ate(Choc01ate chocolate) / TODO Auto - generated method stubSystem.out.println(this.getClass().getSimpleName()+"對(duì)"+chocolate.getName()+" 收銀)abstract class Shop
51、protected String name;public Shop(String name) =name;public abstract void accpet(PersonVisitor pv);public String getName() return name;class Apple extends Shoppublic Apple(String name) super(name);/ TODO Auto - generated constructor stubOverridepublic void accpet(PersonVisitor pv) / TODO Au
52、to - generated method stub pv.visitorApple(this);class Chocolate extends Shoppublic Choc01ate(String name) super(name);/ TODO Auto - generated constructor stubOverridepublic void accpet(PersonVisitor pv) / TODO Auto - generated method stub pv.visitorChoc01ate(this);class ShoppingCartList<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; i < shops.size(); i+) shops.get(i).accpet(visitor);【運(yùn)行截圖】Cust
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 四川省瀘州市瀘縣2024-2025學(xué)年高二上學(xué)期1月期末考試 化學(xué)試題(含答案)
- 福建省泉州市2025屆高中畢業(yè)班質(zhì)量監(jiān)測 (二)地理試題(含答案)
- 08信管1班 080802011017 宏觀經(jīng)濟(jì)學(xué)論文
- 浙江省寧波市九校2024-2025學(xué)年高二上學(xué)期期末聯(lián)考數(shù)學(xué)試題答案
- 2024小學(xué)語文教師心得體會(huì)(33篇)
- 福建省南平市嵐谷中學(xué)2020-2021學(xué)年高三生物期末試卷含解析
- 福建省南平市井后中學(xué)2022年高二數(shù)學(xué)文模擬試卷含解析
- 2025年度安全生產(chǎn)隱患排查治理合同范本6篇
- 2024版港口物流場地租賃合同
- 2025年度企業(yè)財(cái)務(wù)內(nèi)部審計(jì)與合規(guī)性檢查合同3篇
- 新生兒腭裂護(hù)理查房課件
- 二年級(jí)下冊科學(xué)課程綱要
- 前交叉韌帶重建術(shù)后康復(fù)訓(xùn)練
- 河南近10年中考真題數(shù)學(xué)含答案(2023-2014)
- 八年級(jí)上學(xué)期期末家長會(huì)課件
- 2024年大學(xué)試題(宗教學(xué))-佛教文化歷年考試高頻考點(diǎn)試題附帶答案
- 軟件項(xiàng)目服務(wù)外包工作管理辦法
- 紅薯系列產(chǎn)品項(xiàng)目規(guī)劃設(shè)計(jì)方案
- 人教版九年級(jí)上冊化學(xué)默寫總復(fù)習(xí)
- 無人機(jī)地形匹配導(dǎo)航
- 2023-餐飲公司章程范本
評(píng)論
0/150
提交評(píng)論