軟件設(shè)計(jì)模式實(shí)驗(yàn)報(bào)告_第1頁(yè)
軟件設(shè)計(jì)模式實(shí)驗(yàn)報(bào)告_第2頁(yè)
軟件設(shè)計(jì)模式實(shí)驗(yàn)報(bào)告_第3頁(yè)
軟件設(shè)計(jì)模式實(shí)驗(yàn)報(bào)告_第4頁(yè)
軟件設(shè)計(jì)模式實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩18頁(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)介

-.z.計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院實(shí)驗(yàn)報(bào)告課程名稱:軟件設(shè)計(jì)模式專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)班級(jí):2011級(jí)1班**:0**:*進(jìn)平實(shí)驗(yàn)一單例模式的應(yīng)用1實(shí)驗(yàn)?zāi)康?)掌握單例模式〔Singleton〕的特點(diǎn)2)分析具體問(wèn)題,使用單例模式進(jìn)展設(shè)計(jì)。2實(shí)驗(yàn)內(nèi)容和要求很多應(yīng)用工程都有配置文件,這些配置文件里面定義一些應(yīng)用需要的參數(shù)數(shù)據(jù)。通??蛻舳耸褂眠@個(gè)類(lèi)是通過(guò)new一個(gè)AppConfig的實(shí)例來(lái)得到一個(gè)操作配置文件內(nèi)容的對(duì)象。如果在系統(tǒng)運(yùn)行中,有很多地方都需要使用配置文件的內(nèi)容,系統(tǒng)中會(huì)同時(shí)存在多份配置文件的內(nèi)容,這會(huì)嚴(yán)重浪費(fèi)內(nèi)存資源。事實(shí)上,對(duì)于AppConfig類(lèi),在運(yùn)行期間,只需要一個(gè)對(duì)象實(shí)例就夠了。則應(yīng)該怎么實(shí)現(xiàn)呢?用C#控制臺(tái)應(yīng)用程序?qū)崿F(xiàn)該單例模式。繪制該模式的UML圖。UML圖:源代碼:classProgram{staticvoidMain(string[]args){AppConfigappConfigOne=AppConfig.GetParameterA();AppConfigappConfigTwo=AppConfig.GetParameterA();if(appConfigOne.Equals(appConfigTwo)){Console.WriteLine("appConfigOne和appConfigTwo代表的是同一個(gè)實(shí)例!");}else{Console.WriteLine("appConfigOne和appConfigTwo代表的是不同的實(shí)例!");}Console.ReadKey();}}}運(yùn)行結(jié)果:實(shí)驗(yàn)小結(jié):通過(guò)這次實(shí)驗(yàn),我了解了單例模式的具體概念和使用方法,并且感受到了他的優(yōu)點(diǎn)帶來(lái)的方便,但是同時(shí)也知道了該設(shè)計(jì)模式的缺點(diǎn):由于單例模式中沒(méi)有抽象層,因此單例類(lèi)的擴(kuò)展有很大困難。實(shí)驗(yàn)二工廠模式的應(yīng)用1實(shí)驗(yàn)?zāi)康?)掌握工廠模式〔Factory〕的特點(diǎn)2)分析具體問(wèn)題,使用工廠模式進(jìn)展設(shè)計(jì)。2實(shí)驗(yàn)內(nèi)容和要求有一個(gè)OEM制造商代理做HP筆記本電腦(Laptop),后來(lái)該制造商得到了更多的品牌筆記本電腦的訂單Acer,Lenovo,Dell,該OEM商發(fā)現(xiàn),如果一次同時(shí)做很多個(gè)牌子的本本,有些不利于管理。利用工廠模式改善設(shè)計(jì),用C#控制臺(tái)應(yīng)用程序?qū)崿F(xiàn)該OEM制造商的工廠模式。繪制該模式的UML圖。UML圖:源代碼:classLaptop{publicvirtualvoidGetLaptop(){}}classHpLaptop:Laptop{publicoverridevoidGetLaptop(){Console.WriteLine("生產(chǎn)了一臺(tái)Hp電腦");}}classAcerLaptop:Laptop{publicoverridevoidGetLaptop(){Console.WriteLine("生產(chǎn)了一臺(tái)Acer電腦");}}classLenovoLaptop:Laptop{publicoverridevoidGetLaptop(){Console.WriteLine("生產(chǎn)了一臺(tái)Lenovo電腦");}}classDellLaptop:Laptop{publicoverridevoidGetLaptop(){Console.WriteLine("生產(chǎn)了一臺(tái)Dell電腦");}}interfaceIFactory{LaptopCreateFactory();}classHpFactory:IFactory{publicLaptopCreateFactory(){returnnewHpLaptop();}}classAcerFactory:IFactory{publicLaptopCreateFactory(){returnnewAcerLaptop();}}classLenovoFactory:IFactory{publicLaptopCreateFactory(){returnnewLenovoLaptop();}}classDellFactory:IFactory{publicLaptopCreateFactory(){returnnewDellLaptop();}}classProgram{staticvoidMain(string[]args){IFactorylaptopFactory=newLenovoFactory();IFactorylaptopFactory1=newHpFactory();IFactorylaptopFactory2=newAcerFactory();IFactorylaptopFactory3=newDellFactory();Laptoplaptop=laptopFactory.CreateFactory();Laptoplaptop1=laptopFactory1.CreateFactory();Laptoplaptop2=laptopFactory2.CreateFactory();Laptoplaptop3=laptopFactory3.CreateFactory();laptop.GetLaptop();laptop1.GetLaptop();laptop2.GetLaptop();laptop3.GetLaptop();Console.ReadKey();}}}運(yùn)行結(jié)果:實(shí)驗(yàn)小結(jié):通過(guò)本次實(shí)驗(yàn),我了解了工廠模式的適用*圍和他的一些特點(diǎn),工廠模式在一定程度上解決*些代碼違反了面向?qū)ο笤O(shè)計(jì)的開(kāi)放封閉原則。同時(shí)還了解了它的一些優(yōu)點(diǎn)和弊端,比方:使用工廠方法模式的另一個(gè)優(yōu)點(diǎn)是在系統(tǒng)中參加新產(chǎn)品時(shí),無(wú)需修改抽象工廠和抽象產(chǎn)品提供的接口,無(wú)需修改客戶端,也無(wú)需修改其它的具體工廠和具體產(chǎn)品,而只要添加一個(gè)新的具體工廠和具體產(chǎn)品即可。實(shí)驗(yàn)三抽象工廠模式的應(yīng)用1實(shí)驗(yàn)?zāi)康?)掌握抽象工廠模式〔AbstractFactory〕的特點(diǎn)2)分析具體問(wèn)題,使用抽象工廠模式進(jìn)展設(shè)計(jì)。2實(shí)驗(yàn)內(nèi)容和要求麥當(dāng)勞〔McDonalds〕和肯德基〔KFC〕快餐店都經(jīng)營(yíng)漢堡〔Hamburg〕和可樂(lè)〔Cola〕,用C#控制臺(tái)應(yīng)用程序?qū)崿F(xiàn)這兩個(gè)快餐店經(jīng)營(yíng)產(chǎn)品的抽象工廠模式。繪制該模式的UML圖。UML圖:源代碼:interfaceIHamburg{voidHamburgName();}classMcDonaldsHamburg:IHamburg{publicvoidHamburgName(){Console.WriteLine("這是McDonaldsHamburg");}}classKFCHamburg:IHamburg{publicvoidHamburgName(){Console.WriteLine("這是KFCHamburg");}}interfaceICola{voidColaName();}classMcDonaldsCola:ICola{publicvoidColaName(){Console.WriteLine("這是McDonaldsCola");}}classKFCCola:ICola{publicvoidColaName(){Console.WriteLine("這是KFCCola");}}interfaceIFactory{IHamburgCreateHamburg();IColaCreateCola();}classMcDonaldsFactory:IFactory{publicIHamburgCreateHamburg(){returnnewMcDonaldsHamburg();}publicIColaCreateCola(){returnnewMcDonaldsCola();}}classKFCFactory:IFactory{publicIHamburgCreateHamburg(){returnnewKFCHamburg();}publicIColaCreateCola(){returnnewKFCCola();}}classProgram{staticvoidMain(string[]args){IFactoryfactory=newKFCFactory();IFactoryfactory1=newMcDonaldsFactory();IHamburghamburg1=factory1.CreateHamburg();IColacola1=factory1.CreateCola();IHamburghamburg=factory.CreateHamburg();IColacola=factory.CreateCola();hamburg.HamburgName();cola.ColaName();hamburg1.HamburgName();cola1.ColaName();Console.ReadKey();}}}運(yùn)行結(jié)果:實(shí)驗(yàn)小結(jié):通過(guò)本次實(shí)驗(yàn),加深了對(duì)抽象工廠模式的理解。抽象工廠提供一個(gè)創(chuàng)立一系列相關(guān)或相互依賴對(duì)象的接口,而不需指定他們具體的類(lèi)。抽象工廠同樣是存在缺點(diǎn)的,難以支持新種類(lèi)的產(chǎn)品。由于以前對(duì)C++不太了解,本次實(shí)驗(yàn)加深了對(duì)C++的了解,強(qiáng)化了編程能力。理解解了構(gòu)造函數(shù),虛函數(shù),純虛函數(shù),成員函數(shù)實(shí)現(xiàn),類(lèi)之間的繼承等含義。但對(duì)于函數(shù)的調(diào)用問(wèn)題常常出錯(cuò),這在以后的學(xué)習(xí)中應(yīng)多加注意和練習(xí)。實(shí)驗(yàn)四建造者模式的應(yīng)用1實(shí)驗(yàn)?zāi)康?)掌握建造者模式〔Builder〕的特點(diǎn)2)分析具體問(wèn)題,使用建造者模式進(jìn)展設(shè)計(jì)。2實(shí)驗(yàn)內(nèi)容和要求建造者模式是一種創(chuàng)立型模式,它主要是應(yīng)對(duì)工程中一些復(fù)雜對(duì)象的創(chuàng)立工作。所謂"復(fù)雜對(duì)象〞,是指此對(duì)象中還含有其它的子對(duì)象。我們現(xiàn)在定義一個(gè)場(chǎng)景:汽車(chē)生產(chǎn)必須包含車(chē)輪(Wheel)、油箱(OilBo*)和車(chē)身(Body),應(yīng)用建造者模式,用C#控制臺(tái)應(yīng)用程序?qū)崿F(xiàn)該設(shè)計(jì),構(gòu)建BMW品牌和BenZ品牌汽車(chē)生產(chǎn)。繪制該模式的UML圖。UML圖:源代碼:publicabstractclassICar{publicabstractvoidWheel();publicabstractvoidOilBo*();publicabstractvoidBody();}classBenz:ICar{publicoverridevoidWheel(){Console.Write("**的輪子,");}publicoverridevoidOilBo*(){Console.Write("**的油箱,");}publicoverridevoidBody(){Console.WriteLine("**的車(chē)體!");}}classBMW:ICar{publicoverridevoidWheel(){Console.Write("寶馬的輪子,");}publicoverridevoidOilBo*(){Console.Write("寶馬的油箱,");}publicoverridevoidBody(){Console.WriteLine("寶馬的車(chē)體!");}}classDriver{publicvoidinclude(ICarcar){car.Wheel();car.OilBo*();car.Body();}}classProgram{staticvoidMain(string[]args){ICarcar=newBenz();ICarcar1=newBMW();Driverzhangsan=newDriver();zhangsan.include(car);Driverlisi=newDriver();lisi.include(car1);Console.ReadKey();}}}運(yùn)行結(jié)果:實(shí)驗(yàn)小結(jié):建造者模式的設(shè)計(jì)目的是消除其他對(duì)象的復(fù)雜創(chuàng)立過(guò)程。使用建造者模式不僅是最正確的做法,而且在*個(gè)對(duì)象的構(gòu)建和配制方法改變時(shí)可以盡量減少重復(fù)更改代碼實(shí)驗(yàn)五適配器模式的應(yīng)用1實(shí)驗(yàn)?zāi)康?)掌握適配器模式〔Adapter〕的特點(diǎn)2)分析具體問(wèn)題,使用適配器模式進(jìn)展設(shè)計(jì)。2實(shí)驗(yàn)內(nèi)容和要求一個(gè)軟件團(tuán)隊(duì)開(kāi)發(fā)繪圖系統(tǒng),設(shè)計(jì)了圓對(duì)象(Circle)、矩形對(duì)象(Rectangle),線對(duì)象(Line)都支持Draw()函數(shù),即可以通過(guò)Draw()函數(shù)繪制圖形。為了加快工程進(jìn)度,將角度對(duì)象(Angle)繪制功能交給了合作團(tuán)隊(duì)實(shí)現(xiàn)。但合作團(tuán)隊(duì)將角度對(duì)象繪制函數(shù)定為了DrawAngle()。繪圖系統(tǒng)提供應(yīng)用戶后,用戶不滿意,希望能統(tǒng)一的調(diào)用,不用記太多命令。應(yīng)用適配器模式,用C#控制臺(tái)應(yīng)用程序完善該設(shè)計(jì)。繪制該模式的UML圖。

UML圖:源代碼:abstractclassIDrawing{publicabstractvoidDraw();}classCircle:IDrawing{publicoverridevoidDraw(){Console.WriteLine("這是Circle里面的Draw方法");}}classRectangle:IDrawing{publicoverridevoidDraw(){Console.WriteLine("這是Rectangle里面的Draw方法");}}classLine:IDrawing{publicoverridevoidDraw(){Console.WriteLine("這是Line里面的Draw方法");}}classAngle{publicvoidDrawAngle(){Console.WriteLine("這是Angle里面的DrawAngle方法");}}classAdapterAngle:IDrawing{privateAngleag=newAngle();publicoverridevoidDraw(){ag.DrawAngle();}}classProgram{staticvoidMain(string[]args){IDrawingcc=newCircle();cc.Draw();IDrawingrr=newRectangle();rr.Draw();IDrawingll=newLine();ll.Draw();IDrawingaa=newAdapterAngle();aa.Draw();Console.ReadKey();}}}運(yùn)行結(jié)果:實(shí)驗(yàn)小結(jié):適配器模式可以讓任何兩個(gè)沒(méi)有關(guān)聯(lián)的類(lèi)一起運(yùn)行,提高了類(lèi)的復(fù)用,增加了類(lèi)的透明度,靈活性好,但是過(guò)多的使用適配器,會(huì)讓系統(tǒng)非常零亂,不易整體進(jìn)展把握。比方,明明看到調(diào)用的是A接口,其實(shí)內(nèi)部被適配成了B接口的實(shí)現(xiàn),一個(gè)系統(tǒng)如果太多出現(xiàn)這種情況,無(wú)異于一場(chǎng)災(zāi)難。因此如果不是很有必要,可以不使用適配器,而是直接對(duì)系統(tǒng)進(jìn)展重構(gòu)。由于JAVA至多繼承一個(gè)類(lèi),所以至多只能適配一個(gè)適配者類(lèi),而且目標(biāo)類(lèi)必須是抽象類(lèi)。實(shí)驗(yàn)六橋接模式的應(yīng)用1實(shí)驗(yàn)?zāi)康?)掌握橋接模式〔Bridge〕的特點(diǎn)2)分析具體問(wèn)題,使用橋接模式進(jìn)展設(shè)計(jì)。2實(shí)驗(yàn)內(nèi)容和要求一個(gè)咖啡店可以提供大杯(JorumCoffee)、中杯(MediumCoffee)、小杯(SmallCoffee)的咖啡(Coffee),為了滿足不同用戶的口味,在咖啡中可以添加牛奶(Milk),或者糖(Sugar),或者檸檬(Lemon),提供應(yīng)用戶不同口味的組合,如大杯咖啡加牛奶,中杯咖啡加糖,小杯咖啡加檸檬,小杯咖啡加糖等。應(yīng)用橋接模式,用C#控制臺(tái)應(yīng)用程序?qū)崿F(xiàn)該設(shè)計(jì)。繪制該模式的UML圖。UML圖:源代碼:abstractclassSauce{publicabstractvoidMi*ing();}classMilk:Sauce{publicoverridevoidMi*ing(){Console.WriteLine("加牛奶");}}classSugar:Sauce{publicoverridevoidMi*ing(){Console.WriteLine("加糖");}}classLemon:Sauce{publicoverridevoidMi*ing(){Console.WriteLine("加檸檬");}}abstractclassCoffee{protectedSaucesauce;publicvoidAddSauce(Saucesauce){this.sauce=sauce;}publicabstractvoidMi*ing();}classJorumCoffee:Coffee{publicoverridevoidMi*ing(){Console.Write("大杯咖啡");sauce.Mi*ing();}}classMediumCoffee:Coffee{publicoverridevoidMi*ing(){Console.Write("中杯咖啡");sauce.Mi*ing();}}classSmallCoffee:Coffee{publicoverridevoidMi*ing(){Console.Write("小杯咖啡");sauce.Mi*ing();}}classProgram{staticvoidMain(string[]args){//中杯咖啡加牛奶CoffeecoffeeOne=newMediumCoffee();coffeeOne.AddSauce(newMilk());coffeeOne.Mi*ing();//大杯咖啡加糖CoffeecoffeeTwo=newJorumCoffee();coffeeTwo.AddSauce(newSugar());coffeeTwo.Mi*ing();//小杯咖啡加糖CoffeecoffeeThree=newSmallCoffee();coffeeThree.AddSauce(newLemon());coffeeThree.Mi*ing();Console.ReadKey();}}}運(yùn)行結(jié)果:實(shí)驗(yàn)小結(jié):Bridge模式是一個(gè)非常有用的模式,也非常復(fù)雜,它很好的符合了開(kāi)放-封閉原則和優(yōu)先使用對(duì)象,而不是繼承這兩個(gè)面向?qū)ο笤瓌t。該模式使用"對(duì)象間的組合關(guān)系〞解耦了抽象和實(shí)現(xiàn)之間固有的綁定關(guān)系,使得抽象和實(shí)現(xiàn)可以沿著各自的維度來(lái)變化。實(shí)驗(yàn)七裝飾模式的應(yīng)用1實(shí)驗(yàn)?zāi)康?)掌握裝飾模式〔Decorator〕的特點(diǎn)2)分析具體問(wèn)題,使用裝飾模式進(jìn)展設(shè)計(jì)。2實(shí)驗(yàn)內(nèi)容和要求"喜羊羊逃命〞游戲:喜羊羊被灰太狼追,喜羊羊最多5條命,灰太狼每咬到喜羊羊一次,喜羊羊就要少一條命。在逃的過(guò)程中喜羊羊可以吃到三種蘋(píng)果,吃"紅蘋(píng)果〞可以給喜羊羊加上保護(hù)罩,吃"綠蘋(píng)果〞可以加快喜羊羊奔跑速度,吃"黃蘋(píng)果〞可以使喜羊羊趟著水跑。應(yīng)用裝飾模式,用C#控制臺(tái)應(yīng)用程序?qū)崿F(xiàn)該設(shè)計(jì)。繪制該模式的UML圖。UML圖:源代碼:abstractclassState{publicabstractvoidShow();}classAnimal:State{privatestringname;publicAnimal(stringname){=name;}publicoverridevoidShow(){Console.WriteLine("的{0}",name);}}abstractclassApple:State{protectedStateponent;publicvoidDecorator(Stateponent){this.ponent=ponent;}publicoverridevoidShow(){if(ponent!=null){ponent.Show();}}}classProtectiveCover:Apple{publicoverridevoidShow(){//base.Show();Console.Write("有保護(hù)罩");base.Show();}}classRunFast:Apple{publicoverridevoidShow(){//base.Show();Console.Write("跑得快、");base.Show();}}classFlowingWater:Apple{publicoverridevoidShow(){//base.Show();Console.Write("會(huì)趟水、");base.Show();}}classProgram{staticvoidMain(string[]args){Animalpleasantsheep=newAnimal("喜羊羊");ProtectiveCoverpc=newProtectiveCover();RunFastrf=newRunFast();FlowingWaterfw=newFlowingWater();pc.Decorator(pleasantsheep);rf.Decorator(pc);fw.Decorator(rf);fw.Show();Console.ReadKey();}}}運(yùn)行結(jié)果:實(shí)驗(yàn)小結(jié):Decorator模式采用對(duì)象組合而非繼承的手法,實(shí)現(xiàn)了在運(yùn)行時(shí)動(dòng)態(tài)的擴(kuò)展對(duì)象功能的能力,而且可以根據(jù)需要擴(kuò)展多個(gè)功能,防止了單獨(dú)使用繼承帶來(lái)的"靈活性差〞和"多子類(lèi)衍生問(wèn)題〞。同時(shí)它很好地符合面向?qū)ο笤O(shè)計(jì)原則中"優(yōu)先使用對(duì)象組合而非繼承〞和"開(kāi)放-封閉〞原則。實(shí)驗(yàn)八外觀模式的應(yīng)用1實(shí)驗(yàn)?zāi)康?)掌握外觀模式〔Facade〕的特點(diǎn)2)分析具體問(wèn)題,使用外觀模式進(jìn)展設(shè)計(jì)。2實(shí)驗(yàn)內(nèi)容和要求一個(gè)保安系統(tǒng)的,由錄像機(jī)、電燈、紅外線監(jiān)控和警報(bào)器組成。保安系統(tǒng)的操作人員需要經(jīng)常將這些儀器啟動(dòng)和關(guān)閉。保安類(lèi)需要用到所有的錄像機(jī)(Camera)、電燈(Light)、感應(yīng)器(Sensor)和警報(bào)器(Alarm)對(duì)象,保安覺(jué)得使用不方便。應(yīng)用外觀模式,用C#控制臺(tái)應(yīng)用程序改良該設(shè)計(jì)。繪制該模式的UML圖。UML圖:源代碼:publicclassCamera{publicvoidTurnOn(){Console.WriteLine("Turningonthecamera.");}publicvoidTurnOff(){Console.WriteLine("Turningoffthecamera.");}publicvoidRotate(intdegrees){Console.WriteLine("Rotatingthecameraby

{0}degrees.",degrees);}}publicclassLight{publicvoidTurnOff(){Console.WriteLine("Turningonthelight.");}publicvoidTurnOn(){Console.WriteLine("Turningoffthelight.");}publicvoidChangeBulb(){Console.WriteLine("changingthelight-bulb.");}}publicclassSensor{publicvoidActivate(){Console.WriteLine("Activatingthesensor.");}publicvoidDeactivate(){Console.WriteLine("Deactivatingthesensor.");}publicvoidTrigger(){Console.WriteLine("Thesensorhastriggered.");}}publicclassAlarm{publicvoidActivate(){Console.WriteLine("Activatingthealarm.");}publicvoidDeactivate(){Console.WriteLine("Deactivatingthealarm.");}publicvoidRing(){Console.WriteLine("Ringingthealarm.");}publicvoidStopRing(){Console.WriteLine("Stopthealarm.");}}publicclassSecurityFacade{privatestaticCameracamera1,camera2;privatestaticLightlight1,light2,light3;privatestaticSensorsensor;privatestaticAlarmalarm;staticSecurityFacade(){camera1=newCamera();camera2=newCamera();light1=newLight();light2=newLight();light3=newLight();sensor=newSensor();alarm=newAlarm();}publicvoidActivate(){camera1.TurnOn();camera2.TurnOn();light1.TurnOn();light2.TurnOn();light3.TurnOn();sensor.Activate();alarm.Activate();}publicvoidDeactivate(){camera1.TurnOff();camera2.TurnOff();light1.TurnOff();light2.TurnOff();light3.TurnOff();sensor.Deactivate();alarm.Deactivate();}}classProgram{staticvoidMain(string[]args){SecurityFacadesecurity;__security=newSecurityFacade();_security.Activate();_Console.WriteLine("\n--------------------\n");_security.Deactivate();Console.ReadKey();}}}運(yùn)行結(jié)果:實(shí)驗(yàn)小結(jié):Fa?ade模式注重的是簡(jiǎn)化接口,它更多的時(shí)候是從架構(gòu)的層次去看整個(gè)系統(tǒng),而并非單個(gè)類(lèi)的層次。該模式對(duì)客戶屏蔽了子系統(tǒng)組件,因而減少了客戶處理的對(duì)象的數(shù)目并使得子系統(tǒng)使用起來(lái)更加方便。實(shí)現(xiàn)了子系統(tǒng)與客戶之間的松耦合關(guān)系,而子系統(tǒng)內(nèi)部的功能組件往往是緊耦合的。松耦合關(guān)系使得子系統(tǒng)的組件變化不會(huì)影響到它的客戶。實(shí)驗(yàn)九觀察者模式的應(yīng)用1實(shí)驗(yàn)?zāi)康?)掌握外觀模式〔Observer〕的特點(diǎn)2)分析具體問(wèn)題,使用外觀模式進(jìn)展設(shè)計(jì)。2實(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)?說(shuō)明你所選擇的設(shè)計(jì)模式,畫(huà)出類(lèi)關(guān)系圖并指明各個(gè)類(lèi)的角色。應(yīng)用外觀模式,用C#控制臺(tái)應(yīng)用程序改良該設(shè)計(jì)。繪制該模式的UML圖。UML圖:源代碼:publicclassProduct{publicstringname;publicstringprice;publicProduct(strings_name,strings_price){name=s_name;price=s_price;}publicProduct(){name=null;price=null;}}classShopSystem{privateIList<MemberObserver>observers=newList<MemberObserver>();publicIList<Product>products=newList<Product>();publicShopSystem(IList<Product>pro){products=pro;}privatestringaction;publicvoidAttach(MemberObserverobserver){observers.Add(observer);}publicvoidDetach(MemberObserverobserver){observers.Remove(observer);}publicvoidNotify(){foreach(MemberObservermoinobservers)mo.Update();}publicstringProductAction{get{action=null;foreach(Productpinproducts){if(!=null||p.price!=null){action+=+"的價(jià)格變成了"+p.price+"\n";}}returnaction;}set{action=value;}}}classMemberObserver{privatestringname;privateShopSystemsub;publicMemberObserver(stringname,ShopSystemsub){=name;this.sub=sub;}publicvoidUpdate(){Console.WriteLine("{0}請(qǐng)注意!{1}",sub.ProductAction,name);}}classProgram{staticvoidMain(string[]args){ProductproductOne=newProduct();ProductproductTwo=newProduct("襯衫","125元/件");ProductproductThree=newProduct("短袖","60元/件");IList<Product>products=newList<Product>();products.Add(productOne);

溫馨提示

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