2023年軟件設(shè)計模式實驗報告_第1頁
2023年軟件設(shè)計模式實驗報告_第2頁
2023年軟件設(shè)計模式實驗報告_第3頁
2023年軟件設(shè)計模式實驗報告_第4頁
2023年軟件設(shè)計模式實驗報告_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

武彥利於勺爭

WuhanUniversityofScience&Technology

計算機科學與技術(shù)學院

實驗報告

課程名稱:軟件設(shè)計模式

專業(yè):計算機科學與技術(shù)

班級:2023級1班

學號:___________

姓名:?

實驗一單例模式的應(yīng)用

1實驗?zāi)康?/p>

1)掌握單例模式(Singleton)的特點

2)分析具體問題,使用單例模式進行設(shè)計。

2實驗內(nèi)容和規(guī)定

很多應(yīng)用項目都有配置文獻,這些配置文獻里面定義一些應(yīng)用需要的參數(shù)數(shù)

據(jù)。

通常客戶端使用這個類是通過new一個AppConfig的實例來得到一個操

作配置文獻內(nèi)容的對象。假如在系統(tǒng)運營中,有很多地方都需要使用配置文獻的

內(nèi)容,系統(tǒng)中會同時存在多份配置文獻的內(nèi)容,這會嚴重浪費內(nèi)存資源。

事實上,對于AppConfig類,在運營期間,只需要一個對象實例就夠了。

那么應(yīng)當怎么實現(xiàn)呢?用C#控制臺應(yīng)用程序?qū)崿F(xiàn)該單例模式。繪制該模式的UM

L圖。

UML圖:

AppConfig

-ParameterA:string

+GetParameterA()

+SetParameterA()

源代碼:

c1assProgram

staticvoidMain(stringE]args)

AppConfigappConfigOne=AppConfig.GetParameterA();

AppConfigappConfigTwo=AppConfig.GetParameterA();

if(appConfigOne.Equa1s(appConfigTwo))

(

Console.WriteLine("appConfigOne和appConfigTwo代表的是同一-

個實例!”);

}

eIse

{

Console.WriteLine("appConfigOne和appConfigTwo代表

的是不同的實例!");

)

Console.ReadKey();

)

)

)

運營結(jié)果:

■file:〃/C:/Users/LvYong/Desktop/軟件設(shè)...一口

appConfigOne和appConfigTwo代表的是同一個實例!人

實驗小結(jié):

通過這次實驗,我了解了單例模式的具體概念和使用方法,并且感受到了他的優(yōu)點帶來的方

便,但是同時也知道了該設(shè)計模式的缺陷:由于單例模式中沒有抽象層,因此單例類的擴展

有很大困難。

實驗二工廠模式的應(yīng)用

1實驗?zāi)康?/p>

1)掌握工廠模式(Factory)的特點

2)分析具體問題,使用工廠模式進行設(shè)計。

2實驗內(nèi)容和規(guī)定

有一個OEM制造商代理做HP筆記本電腦(Laptop),后來該制造商得到了更

多的品牌筆記本電腦的訂單Acer,Lenovo,Del1,該OEM商發(fā)現(xiàn),假如一次同

時做很多個牌子的本本,有些不利于管理。運用工廠模式改善設(shè)計,用C#控制臺

應(yīng)用程序?qū)崿F(xiàn)該OEM制造商的工廠模式。繪制該模式的UML圖。

UML圖:

川;CreateLaptop,0小4⑺II是”、U入寮.「小工”

源代碼:

classLaptop

pub1icvirtua1voidGetLaptop(){}

)

classHpLaptop:Laptop

(

publicoverridevoidGetLaptop()

{

Console.WriteLine("生產(chǎn)了一臺Hp電腦“);

)

)

classAcerLaptop:Laptop

(

publicovertidevoldGetLaptop()

(

Console.WriteLine("生產(chǎn)了一臺Acer電腦");

)

)

classLenovoLaptop:Laptop

I

publicoverridevoidGetLaptop()

{

Console.WriteLine("生產(chǎn)了一臺Lenovo電腦”);

)

)

cIassDellLaptop:Laptop

publicoverridevoidGetLaptop()

(

Conso1e.WriteLine("生產(chǎn)了一臺De11電腦“);

}

}

interfaceIFactory

LaptopCreateFactory();

)

classHpFactory:Il-'cictorv

pub1icLaptopCreateFactory()

returnnewHpLaptop();

}

classAccrFadory:IFactory

pub1icLaptopCreateFactory()

returnnewAcerLaptop();

}

classLonovoFactory:1Factory

publieLaptopCreateFactory()

returnnewLenovoLaptop();

)

}

classDel1Factory:IFactory

(

publicLaptopCreateFactory()

(

returnnewDellLaptop();

}

}

classProgram

(

staticvoidMain(string[]args)

(

II'actorylaptopFactory=newLenovoEactory();

IFactorylaptopFactoryl=newHpFactory();

IVactory1aptopFactory2=newAcerFactory();

IFactory1aptopFactory3=newDe1IFactory();

Laptop1aptop=laptopFactory.CreateFactory();

Laptoplaptop1=1aptopFactoryl.CreateFactory();

Laptop1aptop2=laptopFactory2.CreateFactory0;

Laptop1aptop3=laptopFactory3.CreateFactory();

1aptop.GetLaptop();

1aptopl.GetLaptop();

1aptop2.GetLaptop();

1aptop3.GetLaptop();

Conso1e.ReadKey();

運營結(jié)果:

■file:〃/C:/Users/LvYong/Desktop/軟件…-

生產(chǎn)了一臺Lenouo電腦

生產(chǎn)了一臺Hp電腦一

生廣了一臺Ace嚏胸

生產(chǎn);一臺De11甫啟

實驗小結(jié):

通過本次實驗,我了解了工廠模式的合用范圍和他的一些特點,工廠模式在一定限度上解決某

些代碼違反了面向?qū)ο笤O(shè)計的開放封閉原則。同時還了解了它的一些優(yōu)點和弊端,比如:使

用工廠方法模式的另一個優(yōu)點是在系統(tǒng)中加入新產(chǎn)品時,無需修改抽象工廠和抽象產(chǎn)品提供

的接口,無需修改客戶端,也無需修改其它的具體工廠和具體產(chǎn)品,而只要添加一個新的具

體工廠和具體產(chǎn)品即可。

實驗三抽象工廠模式的應(yīng)用

1實驗?zāi)康?/p>

1)掌握抽象工廠模式(AbstractFactory)的特點

2)分析具體問題,使用抽象工廠模式進行設(shè)計。

2實驗內(nèi)容和規(guī)定

麥當勞(MeDonaids)和肯德基(KFC)快餐店都經(jīng)營漢堡(Hamburg)和

可樂(Cola),用C#控制臺應(yīng)用程序?qū)崿F(xiàn)這兩個快餐店經(jīng)營產(chǎn)品的抽象工廠模

式。繪制該模式的UML圖。

UML圖:

由于在同一個UML項目中不能同名,所以改為Factoryl,代碼中依然是

Factory

源代碼:

interfaceIllamburg

voidHamburgName();

}

classMcDonaldsHamburg:IHamburg

{

publicvoidHamburgName()

(

Console.WriteLine("這是McDonaIdsHamburg");

}

)

classKFCHamburg:IHamburg

(

publicvoidHamburgName()

(

Conso1e.WriteLine(〃這是KFCHamburg〃);

)

)

interfaceICola

(

voidColaName();

)

classMcDonaldsCola:ICola

(

publicvoidColaName()

Conso1e.WriteLine(〃這是McDonaldsCola");

}

)

classKFCCola:1Co1a

publicvoidCo1aName()

(

Console.WriteLine("這是KFCCola");

)

)

interfaceIFactory

(

IHamburgCreateHamburg();

IColaCreateColaO;

)

classMeDonaIdsFactory:IFactory

publieIHamburgCreateHamburg()

(

returnnewMcDonaldsHamburg();

)

publicIColaCreateCola()

(

returnnewMcDonaldsCola();

)

classKi;CFaclory:IFactory

publieIHamburgCreateHamburg()

returnnewKFCHamburg();

)

publicIColaCreateCola()

(

returnnewKFCCola();

}

classProgram

staticvoidMain(string[]args)

(

IFactoryfactory=newKFCFactory0;

IFactoryfactoryl=newMcDonaldsFactory();

THamburghamburgl=factory1.CreateIIamburg();

IColaco1a1=factory1.CreateColaO;

THamburghamburg=factory.CreateHamburg();

ICo1aco1a=factory.CreateColaO;

hamburg.11amburgName();

cola.ColaName();

hamburg1.HamburgName();

co1al.Co1aName();

Console.ReadKey();

)

)

)

運營結(jié)果:

S3file:///C:/Users/LvYong/Desktop/^...-n

這懸KFCHamburg人

博國FCCola

這是MeDonaIdsHamburg

這7HMeDonaldsCola

實驗小結(jié):

通過本次實驗,加深了對抽象工廠模式的理解。抽象工廠提供一個創(chuàng)建一系列相關(guān)或互相依

賴對象的接口,而不需指定他們具體的類。抽象工廠同樣是存在缺陷的,難以支持新種類的產(chǎn)

品。由于以前對C++不太了解,本次實驗加深了對C++的了解,強化了編程能力。理解解

了構(gòu)造函數(shù),虛函數(shù),純虛函數(shù),成員函數(shù)實現(xiàn),類之間的繼承等含義。但對于函數(shù)的調(diào)用

問題經(jīng)常犯錯,這在以后的學習中應(yīng)多加注意和練習。

實驗四建造者模式的應(yīng)用

1實驗?zāi)康?/p>

1)掌握建造者模式(Builder)的特點

2)分析具體問題,使用建造者模式進行設(shè)計。

2實驗內(nèi)容和規(guī)定

建造者模式是一種創(chuàng)建型模式,它重要是應(yīng)對項目中一些復(fù)雜對象的創(chuàng)建工

作。所謂“復(fù)雜對象”,是指此對象中還具有其它的子對象。我們現(xiàn)在定義一個

場景:汽車生產(chǎn)必須包含車輪(Wheel)、油箱(OilBox)和車身(Body),應(yīng)用建造

者模式,用C#控制臺應(yīng)用程序?qū)崿F(xiàn)該設(shè)計,構(gòu)建BMW品牌和BenZ品牌汽車

生產(chǎn)。繪制該模式的UML圖。

UM注:

抽象

指揮建造

*者

源代碼:

pub1icabstractc1ass1Car

(

publicabstractvoidWheel0;

publicabstractvoidOilBox();

publicabstractvoidBody();

}

classBenz:ICar

(

publicoverridevoidWhee1()

(

Conso1e.Write("奔馳的輪子,”);

)

publicoverridevoidOilBox()

Console.Writ。(”奔馳的油箱,〃);

}

pub1icoverridevoidBody()

Console.WriteLine("奔馳的車體!");

)

c1assBMW:ICar

pub1icoverridevoidWhee1()

Console.Write(H寶馬的輪子,");

pub!icoverridevoidOilBox()

Console.Write("寶馬的油箱,〃);

pub1icoverridevoidBody()

Console.WriteLine("寶馬的車體!”);

)

c1assDriver

pub1icvoidinclude(ICarcar)

car.Whee1();

car.OilBox();

car.Body();

}

)

classProgram

(

staticvoidMain(string[]args)

(

ICarcar=newBenz();

ICarcarl=newBMW();

Driv6rzhangsan=newDriver();

zhangsan.inc1ude(car);

Driverlisi=newDriver();

lisi.inc1ude(carl);

Console.ReadKey();

}

運營結(jié)果:

■file:///C:/Users/LvYong/Desktop/軟彳牛模...~

磐解嚏始糖IWi

實驗小結(jié):

建造者模式的設(shè)計目的是消除其他對象的復(fù)雜創(chuàng)建過程。使用建造者模式

不僅是最佳的做法,并且在某個對象的構(gòu)建和配制方法改變時可以盡量減少反

復(fù)更改代碼

實驗五適配器模式的應(yīng)用

1實驗?zāi)康?/p>

1)掌握適配器模式(Adapter)的特點

2)分析具體問題,使用適配器模式進行設(shè)計。

2實驗內(nèi)容和規(guī)定

一個軟件團隊開發(fā)繪圖系統(tǒng),設(shè)計了圓對象(Circ1e)、矩形對象(Rectangl

e),線對象(Line)都支持Draw。函數(shù),即可以通過Draw。函數(shù)繪制圖形。為

了加快項目進度,將角度對象(Angle)繪制功能交給了合作團隊實現(xiàn)。但合作

團隊將角度對象繪制函數(shù)定為了DrawAngle()。繪圖系統(tǒng)提供應(yīng)用戶后,用戶不

滿意,希望能統(tǒng)一的調(diào)用,不用記太多命令。應(yīng)用適配器模式,用C#控制臺應(yīng)用

程序完善該設(shè)計。繪制該模式的UML圖。

UML圖:

源代碼:

abstractclassIDrawing

(

pub1icabstractvoldDraw();

I

classCircle:IDrawing

(

publicoverridevoidDraw()

(

Console.WriteLine("這是Circle里面的Draw方法");

)

)

classRectangle:{Drawing

publicoverridevoidDraw()

Conso1e.WriteLine("這是Rectang1e里面的Draw方法”);

)

}

c1assLine:IDrawing

(

publicoverridevoidDraw()

(

Conso1e.WriteLine("這是Line里面的Draw方法”);

)

}

classAngle

(

pub1icvoidDrawAngleO

(

Console.WriteLine("這是Angle里面的DrawAngle方法”);

)

)

classAdapterAng1e:IDrawing

(

privateAngleag=newAngle();

publicoverridevoidDraw()

(

ag.DrawAng1e();

)

}

classProgram

staticvoidMain(string[]args)

1I)ra\\ingcc=newCircIc();

cc.Draw();

1ngrr=newRecttingle();

rr.Draw();

IDrawing11=newLine();

11.Draw();

IDrawingaa=newAdapterAngle();

aa.Draw();

Conso1e.ReadKey();

)

運營結(jié)果:

13file:〃/C:/Users/LvYong/Desktop/軟件設(shè)tt模...一口

Circle里面的Dravi方蟲、*

Rectangle里面的Dkai,方法

,Line里面的Dpaw方法

8這是Angle里面的D?a”Angle方法

實驗小結(jié):

適配器模式可以讓任何兩個沒有關(guān)聯(lián)的類一起運營,提高了類的復(fù)用,增長了類的透明

度,靈活性好,但是過多的使用適配器,會讓系統(tǒng)非常零亂,不易整體進行把握。比如,

明明看到調(diào)用的是A接口,其實內(nèi)部被適配成了B接口的實現(xiàn),一個系統(tǒng)假如太多余現(xiàn)這種

情況,無異于一場劫難。因此假如不是很有必要,可以不使用適配器,而是直接對系統(tǒng)進行

重構(gòu)。由于JAVA至多繼承一個類,所以至多只能適配一個適配者類,并且目的類必須是

抽象類。

實驗六橋接模式的應(yīng)用

1實驗?zāi)康?/p>

1)掌握橋接模式(Bridge)的特點

2)分析具體問題,使用橋接模式進行設(shè)計。

2實驗內(nèi)容和規(guī)定

一個咖啡店可以提供大杯(JorumCoffbe)、中杯(MediumCoffee)、小

杯(SmallCoffee)的咖啡(Coffee),為了滿足不同用戶的口味,在咖啡中可以添

加牛奶(Mi1k),或者糖(Sugar),或者檸檬(Lemon),提供應(yīng)用戶不同口味的組

合,如大杯咖啡加牛奶,中杯咖啡加糖,小杯咖啡加檸檬,小杯咖啡加糖等。應(yīng)用

橋接模式,用C#控制臺應(yīng)用程序?qū)崿F(xiàn)該設(shè)計。繪制該模式的UML圖。

UML圖:

咖啡調(diào)料

源代碼:

abstractclassSauce

publieabstractvoidMixing();

)

classMi1k:Sauce

(

publicoverridevoidMixing()

(

Console.WriteLine(〃加牛奶”);

}

)

c1assSugar:Sauce

(

publicoverridevoidMixing()

(

Console.WriteLine(“加糖〃);

)

}

classLemon:Sauce

(

publicoverridevoidMixing()

{

Conso1e.WriteLine("加檸檬〃);

}

)

abstractclassCoffee

protectedSaucesauce;

publicvoidAddSauce(Saucesauce)

(

this.sauce=sauce;

)

publicabstractvoidMixing();

classJorumCoir('c:Cof「co

publicoverridevoidMixing()

(

Console.Write("大杯咖啡");

sauce.Mixing();

}

)

c1assMediumCoffee:Coffee

(

publicoverridevoidMixingO

(

Console.Write("中杯咖啡");

sauce.Mixing();

)

)

classSmallCon'ee:Coflee

publieoverridevoidMixing()

Conso1e.Write("小杯咖啡〃);

sauce.Mixing();

)

}

classProgram

(

staticvoidMain(string[]args)

(

〃中杯咖啡加牛奶

Coffeecoffee0ne=newMediumCoffee();

coffee0ne.AddSauce(newMi1k());

coffee0ne.Mixing();

//大杯咖啡加糖

CoffeecoffeeTwo=newJorumCoffee();

coffeeTwo.AddSauce(newSugar());

coffeeTwo.Mixing();

〃小杯咖啡加糖

CoffeecoffeeThree=newSma1ICoffee();

coffeeThree.AddSauce(newLemon());

coffeeThree.MixingO;

Console.ReadKey();

)

}

運營結(jié)果:

■file:〃/C:/Users/LvYong/Desktop/軟件…n

加牛奶

小林痂琲;加加糖停檬

實驗小結(jié):

Bridge模式是一個非常有用的模式,也非常復(fù)雜,它很好的符合了開放-封閉原則和優(yōu)

先使用對象,而不是繼承這兩個面向?qū)ο笤瓌t。該模式使用''對象間的組合關(guān)系”解耦了抽象

和實現(xiàn)之間固有的綁定關(guān)系,使得抽象和實現(xiàn)可以沿著各自的維度來變化。

實驗七裝飾模式的應(yīng)用

1實驗?zāi)康?/p>

1)掌握裝飾模式(Decorator)的特點

2)分析具體問題,使用裝飾模式進行設(shè)計。

2實驗內(nèi)容和規(guī)定

“喜羊羊逃命,,游戲:喜羊羊被灰太狼追,喜羊羊最多5條命,灰太狼每咬到

喜羊羊一次,喜羊羊就要少一條命。在逃的過程中喜羊羊可以吃到三種蘋果,吃“紅

蘋果”可以給喜羊羊加上保護罩,吃“綠蘋果”可以加快喜羊羊奔跑速度,吃“黃蘋

果''可以使喜羊羊趟著水跑。應(yīng)用裝飾模式,用C#控制臺應(yīng)用程序?qū)崿F(xiàn)該設(shè)計。

繪制該模式的UML圖。

UML圖:

源代碼:

abstractclassState

publicabstractvoidShow();

}

classAnima1:State

!

privatestringname;

pub1icAnimal(stringname)

(

this,name=name;

}

pub1icoverridevoidShow()

{

Conso1e.WriteLine("的{0}〃,name);

)

)

abstractclassApple:State

protectedStatecomponent;

publievoidDecorator(Statecomponent)

(

this.component=component;

)

publicoverridevoidShow()

(

if(component!=nu11)

(

component.Show();

}

)

)

classProtectiveCover:Apple

(

publicoverridevoidShow()

(

//base.Show();

Console.Write(“有保護罩");

base.Show();

)

)

classRunl;?isi:Apple

publicoverridevoidShow()

(

//base.ShowO;

Console.Write(“跑得快、");

base.Show();

}

)

classFlowingWater:Appie

{

publicoverridevoidShow()

(

//base.Show();

Console.Write("會趟水、");

base.Show();

}

)

classProgram

(

staticvoidMain(string[]args)

(

Animalpleasantsheep=newAninia1("喜羊羊");

ProIectiveCoverpc=newProtectiveCover();

RunFastrf=newRunFast();

FlowingWaterfw=newFlowingWater();

pc.Decorator(p1easantsheep);

rf.Decorator(pc);

fw.Decorator(rf);

fw.Show();

Conso1e.ReadKey();

}

}

)

運營結(jié)果:

-file:///C:/Users/LvYong/Desktop儆件設(shè)...-口

會趟水、跑得快、有保護罩的喜羊羊A

實驗小結(jié):

Decorator模式采用對象組合而非繼承的手法,實現(xiàn)了在運營時動態(tài)的擴展對象功能的能

力,并且可以根據(jù)需要擴展多個功能,避免了單獨使用繼承帶來的''靈活性差"和''多子類衍生

問題同時它很好地符合面向?qū)ο笤O(shè)計原則中''優(yōu)先使用對象組合而非繼承"和''開放-封

閉”原則。

實驗八外觀模式的應(yīng)用

1實驗?zāi)康?/p>

1)掌握外觀模式(Facade)的特點

2)分析具體問題,使用外觀模式進行設(shè)計。

2實驗內(nèi)容和規(guī)定

一個保安系統(tǒng)的,由錄像機、電燈、紅外線監(jiān)控和警報器組成。保安系統(tǒng)的操

作人員需要經(jīng)常將這些儀器啟動和關(guān)閉。保安類需要用到所有的錄像機(Came

ra)、電燈(Light)、感應(yīng)器(Sensor)和警報器(A1arm)對象,保安覺得使

用不方便。應(yīng)用外觀模式,用C#控制臺應(yīng)用程序改善該設(shè)計。繪制該模式的UM

L圖。

UML圖:

源代碼:

publicclassCamera

pub1icvoidTurn0n()

Console.WriteLine("Turningonthecamera.H);

}

pub1icvoidTurnOff()

Console.WriteLine("Turningofftheearnera.〃);

}

publicvoidRotate(intdegrees)

Console.WriteLine("Rotatingthecameraby{0}degrees.z,,d

grees);

}

)

publicc1assLight

(

publievoidTurnOff()

(

Console.WriteLine(〃Turningonthe1ight.;

}

pub1icvoidTurnOn()

(

Conso1e.WriteLine("Turningoffthelight.〃);

}

publicvoidChangeBu1b()

(

Console.WriteLine(Hchangingthe1ight-bulb.");

)

)

publicc1assSensor

pub1icvoidActivateO

Console.WriteLine("Activatingthesensor.;

publievoidDeactivate()

Console.WriteLine(〃Deactivatingthesensor.z,);

publicvoidTrigger()

Console.WriteLine("Thesensorhastriggered.");

publicclassAlarm

publicvoidActivateO

Conso1e.WriteLine(HActivatingthealarm.n);

publicvoidDeactivate()

Conso1e.WriteLine("Deactivatingthea1arm.");

)

publievoidRing()

(

Console.WriteLine("Ringingthealarm.");

}

pub1icvoidStopRingO

Console.WriteLine(z,Stopthea1arm.");

)

pub1icc1assSecurityFacade

privatestaticCameracamera1,camera2;

privatestaticLight1ight1,light2,1ight3;

privatestaticSensorsensor;

privatestaticAlarmalarm;

staticSecurityFacade()

(

camera1=newCamera();

camera2=newCamera();

lightl=newLight();

1ight2=newLight();

1ight3=newLight();

sensor=newSensor();

alarm=newAlarm();

}

publicvoidActivate()

(

cameral.TurnOn();

camera2.TurnOn();

1ight1.TurnOn();

light2.TurnOn();

light3.TurnOn();

sensor.Activate();

alarm.Activate();

)

publicvoidDeactivate()

(

camera1.TurnOff();

camera2.TurnOff();

lightl.TurnOff();

light2.TurnOff();

light3.Turn0ff();

sensor.Deactivate();

alarm.Deactivate();

}

)

classProgram

(

staticvoidMain(string[]args)

SecurityFacadesecurity;_

security=newSecurityFacade()

security.Activate();_

Conso1e.WriteLine(z,\n--------------------------\n〃);

security.Deactivate();

Console.ReadKey();

)

)

運營結(jié)果:

?file:〃/C:/Users/LvYong/Desktop儆件'Sti■模...一口

Turning?on?the?canera.A

Turning?on?the?canera.

Turning?off?the?light.

Turning?off?the?light.

Turning?o£f?the?light.

Actiuating?the?sensoi*.

Actiuating?the?alarn.

Turning?off?the?canera.

Turning?off?the?canera.

Turning?on?the?light.

Turning?on?the?light.

Turning?on?the?light.

Deactiuating?the?sensoi*.

Deactiuating?the?alarm.

搜狗拼音輸入法半:V

<>J

實驗小結(jié):

Fagade模式注重的是簡化接口,它更多的時候是從架構(gòu)的層次去看整個系統(tǒng),而并非單個

類的層次。該模式對客戶屏蔽了子系統(tǒng)組件,因而減少了客戶解決的對象的數(shù)目并使得子系

統(tǒng)使用起來更加方便。實現(xiàn)了子系統(tǒng)與客戶之間的松耦合關(guān)系,而子系統(tǒng)內(nèi)部的功能組件往

往是緊耦合的。松耦合關(guān)系使得子系統(tǒng)的組件變化不會影響到它的客戶。

實驗九觀測者模式的應(yīng)用

1實驗?zāi)康?/p>

1)掌握外觀模式(Observer)的特點

2)分析具體問題,使用外觀模式進行設(shè)計。

2實驗內(nèi)容和規(guī)定

網(wǎng)上商店中假如商品(product)在名稱(name)、價格(price)等方面有

變化,系統(tǒng)能自動告知會員,將是網(wǎng)上商店區(qū)別傳統(tǒng)商店的一大特色。如何設(shè)計實

現(xiàn)?說明你所選擇的設(shè)計模式,畫出類關(guān)系圖并指明各個類的角色。應(yīng)用外觀模

式,用C#控制臺應(yīng)用程序改善該設(shè)計。繪制該模式的UML圖。

UMM:

源代碼:

publicclassProduct

(

pub1icstringname;

publiestringprice;

publicProduet(strings_name,stringsprice)

(

name=s_name;

price=s_price;

)

pub1icProduct()

(

name=nul1;

price=nul1;

)

)

c1assShopSystem

(

privateIList<MemberObserver>observers=newList<M

emberObserver>();

publicIList<Product>products=newList<Product>();

publicShopSystem(IList<Product>pro)

(

products=pro;

}

privatestringaction;

publicvoidAttach(Member0bserverobserver)

(

observers.Add(observer);

}

publievoidDetach(MemberObserverobserver)

(

observers.Remove(observer);

}

publicvoidNotify()

foreach(MemberObservermoinobservers)

mo.Update();

)

pubIicstringProductAction

(

get

(

action=null;

foreach(Productpinproducts)

(

if(p.name!=nul1二p.price!=null)

{

action+=p.name+”的價格變成了"+p.pric

e+"\n”;

)

)

returnaction;

)

set

{

action=value;

}

)

)

classMemberObserver

privatestringname;

privateShopSystemsub;

publicMemberObserver(stringname,ShopSystemsub)

(

this.name=name;

this,sub=sub;

)

publicvoidUpdate()

{

Conso1e.WriteLine("{0}請注意!{1}”,sub.ProductAction,na

me);

)

)

classProgram

(

staticvoidMain(string[]args)

(

ProductproductOne=newProduct();

ProductproductTwo=newProduct("襯衫〃,T25元/件”);

ProductproductThree=newProduct("短袖","60元/件")

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論