中南大学设计模式实验6.docx
- 文档编号:24843279
- 上传时间:2023-06-02
- 格式:DOCX
- 页数:22
- 大小:260.63KB
中南大学设计模式实验6.docx
《中南大学设计模式实验6.docx》由会员分享,可在线阅读,更多相关《中南大学设计模式实验6.docx(22页珍藏版)》请在冰豆网上搜索。
中南大学设计模式实验6
《软件体系结构》
实验报告
项目名称行为型设计模式
专业班级1206
学号3901120604
姓名金初阳
实验成绩:
批阅教师:
年月日
实验6行为型设计模式实验
实验学时:
2
每组人数:
1
实验类型:
3(1:
基础性2:
综合性3:
设计性4:
研究性)
实验要求:
1(1:
必修2:
选修3:
其它)
实验类别:
3(1:
基础2:
专业基础3:
专业4:
其它)
一、实验目的
熟练使用PowerDesigner和任意一种面向对象编程语言实现几种常见的行为型设计模式,包括观察者模式和策略模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式。
二、实验内容
1.某实时在线股票软件需要提供如下功能:
当股票购买者所购买的某支股票价格变化幅度达到5%时,系统将自动发送通知(包括新价格)给购买该股票的所有股民。
试使用观察者模式设计并实现该系统,要求绘制相应的类图并编程模拟实现。
2.某公司欲开发一套机房监控系统,如果机房达到某一指定温度,温度传感器(Thermosensor)将自动传递信号给各种响应设备,例如警示灯(CautionLight)将闪烁(flicker())、报警器(Annunciator)将发出警报(alarm())、安全逃生门(SecurityDoor)将自动开启(open())、隔热门(InsulatedDoor)将自动关闭(close())等,每一种响应设备的行为由专门的程序来控制。
为了将来能够方便地引入新类型的响应设备,采用观察者模式和适配器模式设计并模拟实现该系统。
3.某软件公司为某电影院开发了一套影院售票系统,在该系统中需要为不同类型的用户提供不同的电影票(MovieTicket)打折(Discount)方式,具体打折方案如下:
(1)学生凭学生证可享受票价8折优惠;
(2)年龄在10周岁及以下的儿童可享受每张票减免10元的优惠(原始票价需大于等于20元);
(3)影院VIP用户除享受票价半价优惠外还可进行积分,积分累计到一定额度可换取电影院赠送的奖品。
该系统在将来可能还要根据需要引入新的打折方式。
试使用策略模式设计并编程模拟实现该影院售票系统。
4.某软件公司欲开发一款飞机模拟系统,该系统主要模拟不同种类飞机的飞行特征与起飞特征,需要模拟的飞机种类及其特征如表1所示:
表1飞机种类及特征一览表
飞机种类
起飞特征
飞行特征
直升机(Helicopter)
垂直起飞(VerticalTakeOff)
亚音速飞行(SubSonicFly)
客机(AirPlane)
长距离起飞(LongDistanceTakeOff)
亚音速飞行(SubSonicFly)
歼击机(Fighter)
长距离起飞(LongDistanceTakeOff)
超音速飞行(SuperSonicFly)
鹞式战斗机(Harrier)
垂直起飞(VerticalTakeOff)
超音速飞行(SuperSonicFly)
为将来能够模拟更多种类的飞机,试采用策略模式设计并模拟实现该飞机模拟系统。
三、实验要求
1.结合实例,正确无误地绘制观察者模式和策略模式的模式结构图;
2.使用任意一种面向对象编程语言实现观察者模式和策略模式实例,代码运行正确无误。
四、实验步骤
1.结合实例,使用PowerDesigner绘制观察者模式实例结构图并用面向对象编程语言实现该模式实例;
2.结合实例,使用PowerDesigner绘制观察者模式实例结构图并用面向对象编程语言实现该模式实例;
3.结合实例,使用PowerDesigner绘制策略模式实例结构图并用面向对象编程语言实现该模式实例;
4.结合实例,使用PowerDesigner绘制策略模式实例结构图并用面向对象编程语言实现该模式实例。
五、实验结果
1.类图:
实现代码:
Client.java
packagecom.exercise4.Test1;
publicclassClient{
publicstaticvoidmain(String[]args){
Investorinvestor1=newInvestor("张三");
Investorinvestor2=newInvestor("李四");
Investorinvestor3=newInvestor("王五");
Investorinvestor4=newInvestor("赵六");
StockObserverobserver=newConcreteStockAObserver();
observer.attach(investor1);
observer.attach(investor2);
observer.attach(investor3);
observer.attach(investor4);
Stockstock=newConcreteStockA(100,"广州药业");
stock.attch(observer);
stock.setPrice(120);
}
}
Stock.java
packagecom.exercise4.Test1;
importjava.util.ArrayList;
importjava.util.List;
publicabstractclassStock{
protecteddoubleprice;
protectedStringname;
publicdoublegetPrice(){
returnprice;
}
publicvoidsetPrice(doubleprice){
this.price=price;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
protectedList
publicvoidattch(StockObserverobserver){
observers.add(observer);
}
publicvoiddetach(StockObserverobserver){
observers.remove(observer);
}
publicvoidinformObs(Stockstock){
for(StockObserverobs:
observers){
obs.informInsesters(stock);
}
}
}
ConcreteStockA.java
packagecom.exercise4.Test1;
publicclassConcreteStockAextendsStock{
publicConcreteStockA(){
super();
//TODOAuto-generatedconstructorstub
}
publicConcreteStockA(doubleprice,Stringname){
super();
super.price=price;
super.name=name;
}
publicdoublegetPrice(){
returnprice;
}
publicvoidsetPrice(doublenewPrice){
if(newPrice/price>1.05){
this.price=newPrice;
super.informObs(this);
}else{
this.price=newPrice;
}
}
}
StockObserver.java
packagecom.exercise4.Test1;
publicinterfaceStockObserver{
voidinformInsesters(Stockstock);
voidattach(Investorinvestor);
voiddetach(Investorinvestor);
}
StockObserver.java
packagecom.exercise4.Test1;
publicinterfaceStockObserver{
voidinformInsesters(Stockstock);
voidattach(Investorinvestor);
voiddetach(Investorinvestor);
}
packagecom.exercise4.Test1;
publicclassInvestor{
privateStringname;
publicInvestor(Stringname){
super();
this.name=name;
}
publicvoidrecieve(Stockstock){
System.out.println(name+"收到股票涨价通知,"+stock.getName()+"涨幅达到5%,价格为"+stock.getPrice());
}
}
实验结果:
2.类图:
实现代码:
Client.java
packagecom.exercise4.Test2;
publicclassClient{
publicstaticvoidmain(String[]args){
Annunciatorannunciator=newAnnunciator();
TemperatureObserverobserver1=newAnnunciatorAdapter(annunciator);
CautionLightcautionLight=newCautionLight();
TemperatureObserverobserver2=newCautionLightAdapter(cautionLight);
InsulatedDoorinsulateddoor=newInsulatedDoor();
TemperatureObserverobserver3=newInsulatedDoorAdapter(insulateddoor);
SecurityDoorsecurityDoor=newSecurityDoor();
TemperatureObserverobserver4=newSecurityDoorAdapter(securityDoor);
Temperaturetemperature=newTemperature();
temperature.attach(observer1);
temperature.attach(observer2);
temperature.attach(observer3);
temperature.attach(observer4);
temperature.setDegree(40);
}
}
CautionLightAdapter.java
packagecom.exercise4.Test2;
publicclassCautionLightAdapterimplementsTemperatureObserver{
privateCautionLightcautionLight;
publicCautionLightAdapter(){
}
publicCautionLightAdapter(CautionLightcautionLight){
super();
this.cautionLight=cautionLight;
}
@Override
publicvoidupdate(){
cautionLight.flicker();
}
}
CautionLight.java
packagecom.exercise4.Test2;
publicclassCautionLight{
publicvoidflicker(){
System.out.println("CautionLightisflickering");
}
}
SecurityDoorAdapter.java
packagecom.exercise4.Test2;
publicclassSecurityDoorAdapterimplementsTemperatureObserver{
privateSecurityDoordoor;
publicSecurityDoorAdapter(SecurityDoordoor){
super();
this.door=door;
}
publicSecurityDoorAdapter(){
super();
//TODOAuto-generatedconstructorstub
}
@Override
publicvoidupdate(){
if(door!
=null){
door.open();
}
}
}
SecurityDoor.java
packagecom.exercise4.Test2;
publicclassSecurityDoor{
publicvoidopen(){
System.out.println("SecurityDoorisopening");
}
}
InsulatedDoorAdapter.java
packagecom.exercise4.Test2;
publicclassInsulatedDoorAdapterimplementsTemperatureObserver{
privateInsulatedDoordoor;
publicInsulatedDoorAdapter(){
super();
//TODOAuto-generatedconstructorstub
}
publicInsulatedDoorAdapter(InsulatedDoordoor){
super();
this.door=door;
}
@Override
publicvoidupdate(){
if(door!
=null){
door.close();
}
}
}
InsulatedDoor.java
packagecom.exercise4.Test2;
publicclassInsulatedDoor{
publicvoidclose(){
System.out.println("InsulatedDoorisopening");
}
}
AnnunciatorAdapter.java
packagecom.exercise4.Test2;
publicclassAnnunciatorAdapterimplementsTemperatureObserver{
privateAnnunciatorannunciator;
publicAnnunciatorAdapter(Annunciatorannunciator){
super();
this.annunciator=annunciator;
}
publicAnnunciatorAdapter(){
super();
//TODOAuto-generatedconstructorstub
}
@Override
publicvoidupdate(){
if(annunciator!
=null){
annunciator.alarm();
}
}
}
TemperatureObserver.java
packagecom.exercise4.Test2;
publicinterfaceTemperatureObserver{
voidupdate();
}
实验结果:
3.类图:
实现代码:
packagecom.exercise4.Test3;
importutil.ParseXML;
publicclassClinet{
publicstaticvoidmain(String[]args){
Discountdiscount=(Discount)ParseXML.getBeanObj();
Cinemacinema=newCinema();
cinema.setDiscount(discount);
cinema.showDisCount(50);
}
}
packagecom.exercise4.Test3;
publicinterfaceDiscount{
doublediscountScheme(doubleprice);
}
packagecom.exercise4.Test3;
publicclassStudentDiscountimplementsDiscount{
@Override
publicdoublediscountScheme(doubleprice){
//TODOAuto-generatedmethodstub
returnprice*0.8;
}
}
packagecom.exercise4.Test3;
publicclassVIPDiacountimplementsDiscount{
@Override
publicdoublediscountScheme(doubleprice){
//TODOAuto-generatedmethodstub
System.out.println("是VIP,已积分");
returnprice/2;
}
}
packagecom.exercise4.Test3;
publicclassChildDiscountimplementsDiscount{
@Override
publicdoublediscountScheme(doubleprice){
if(price>=20){
returnprice-10;
}
returnprice;
}
}
packagecom.exercise4.Test3;
publicclassCinema{
privateDiscountdiscount;
publicvoidsetDiscount(Discountdiscount){
this.discount=discount;
}
publicvoidshowDisCount(doubleprice){
System.out.println("原价"+price+",打折后需要支付"+discount.discountScheme(price));
}
}
实验结果:
4.类图:
实现代码:
packagecom.exercise4.Test4;
importjava.util.ArrayList;
importjava.util.List;
publicclassClient{
publicstaticvoidmain(String[]args){
List
FlyMethodsubSonicFly=newSubSonicFly();
FlyMethodsuperSonicFly=newSuperSonicFly();
TakeOffMethodverticalTakeOff=newVerticalTakeOff();
TakeOffMethodlongDistanceTakeOff=newLongDistanceTakeOff();
Planehelicopter=newHelicopter("直升机");
PlaneairPlane=newAirPlane("客机");
Planefighter=newFighter("歼击机");
Planeharrier=newHarrier("战斗机");
helicopter.setTakeOffMethod(verticalTakeOff);
helicopter.setFlyMethod(subSonicFly);
airPlane.setTakeOffMethod(longDistanceTakeOff);
airPlane.setFlyMethod(subSonicFly);
fighter.setTakeOffMethod(longDistanceTakeOff);
fighter.setFlyMethod(superSonicFly);
harrier.setTakeOffMethod(verticalTakeOff);
harrier.setFlyMethod(superSonicFly);
planes.add(helicopter);
planes.add(airPlane);
planes.add(fighter);
planes.add(harrier);
for(Planeplane:
planes){
System.out.println(plane.n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中南 大学 设计 模式 实验