设计模式软件体系结构实验6中南大学软件学院.docx
- 文档编号:18236349
- 上传时间:2023-08-14
- 格式:DOCX
- 页数:19
- 大小:56.06KB
设计模式软件体系结构实验6中南大学软件学院.docx
《设计模式软件体系结构实验6中南大学软件学院.docx》由会员分享,可在线阅读,更多相关《设计模式软件体系结构实验6中南大学软件学院.docx(19页珍藏版)》请在冰点文库上搜索。
设计模式软件体系结构实验6中南大学软件学院
《软件体系结构》
实验报告
项目名称行为型设计模式实验
专业班级
学号
姓名
实验成绩:
批阅教师:
年月日
实验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.类图:
实现代码:
//代码颜色使用黑色,字体使用TimesNewRoman或Arial,字号为五号,如
abstractclassShape
importutil.XMLUtil;
publicclassClient{
publicstaticvoidmain(String[]args){
StockSubjectsubject=(StockSubject)XMLUtil.getBean("subject");
InvesterObserverobserver=(InvesterObserver)XMLUtil.getBean("observer");
subject.attach(observer);
subject.notice();
}
}
publicclassInvesterimplementsInvesterObserver{
@Override
publicvoidupdate(){
System.out.println("今年股票风云莫测,这都是命啊!
");
}
}
publicclassStockextendsStockSubject{
publicvoidnotice(){
for(InvesterObserverinvester:
super.observerList){
invester.update();
}
}
}
publicinterfaceInvesterObserver{
voidupdate();
}
importjava.util.ArrayList;
publicabstractclassStockSubject{
protectedArrayList
publicvoidattach(InvesterObserverobserver){
observerList.add(observer);
}
publicvoiddetach(InvesterObserverobserver){
observerList.remove(observer);
}
publicabstractvoidnotice();
}
packageutil;
importjava.io.File;
importjava.io.IOException;
importjavax.xml.parsers.DocumentBuilder;
importjavax.xml.parsers.DocumentBuilderFactory;
importjavax.xml.parsers.ParserConfigurationException;
importorg.w3c.dom.Document;
importorg.w3c.dom.Node;
importorg.w3c.dom.NodeList;
importorg.xml.sax.SAXException;
publicclassXMLUtil{
publicstaticObjectgetBean(StringtagName){
try{
//创建DOM文档对象
DocumentBuilderFactorydocFactory=DocumentBuilderFactory.newInstance();
DocumentBuilderdocBuilder=docFactory.newDocumentBuilder();
Documentdocument=docBuilder.parse(newFile("config.xml"));
//获取包含类名的文本节点
NodeListnl=document.getElementsByTagName(tagName);
NodeclassNode=nl.item(0).getFirstChild();
StringclassName=classNode.getNodeValue();
//通过类名生成实例对象并将其返回
@SuppressWarnings("rawtypes")
Classclazz=Class.forName(className);
Objectobj=clazz.newInstance();
returnobj;
}catch(ParserConfigurationExceptione){
e.printStackTrace();
}catch(SAXExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}catch(ClassNotFoundExceptione){
e.printStackTrace();
}catch(InstantiationExceptione){
e.printStackTrace();
}catch(IllegalAccessExceptione){
e.printStackTrace();
}
returnnull;
}
}
xmlversion="1.0"encoding="UTF-8"?
>
2.类图:
实现代码:
publicclassClient{
publicstaticvoidmain(String[]args){
MySubjectsubject=newThermosensor();
MyObservercautionLight=newCautionLightAdapter();
MyObserverannunciator=newAnnunciatorAdapter();
MyObserversecurityDoor=newSecurityDoorAdapter();
MyObserverinsulatedDoor=newInsulatedDoorAdapter();
subject.attach(cautionLight);
subject.attach(annunciator);
subject.attach(securityDoor);
subject.attach(insulatedDoor);
subject.warning();
}
}
importjava.util.ArrayList;
publicabstractclassMySubject{
protectedArrayList
publicvoidattach(MyObservermyObserver){
observerList.add(myObserver);
}
publicvoiddetach(MyObservermyObserver){
observerList.remove(myObserver);
}
publicabstractvoidwarning();
}
publicinterfaceMyObserver{
voidupdate();
}
publicclassThermosensorextendsMySubject{
publicvoidwarning(){
System.out.println("温度达到警报界限");
for(MyObserverobserver:
super.observerList){
observer.update();
}
}
}
publicclassAnnunciatorAdapterimplementsMyObserver{
publicAnnunciatorannunciator=newAnnunciator();
@Override
publicvoidupdate(){
annunciator.alarm();
}
}
publicclassAnnunciator{
publicvoidalarm(){
System.out.println("报警器发出警报");
}
}
publicclassCautionLightAdapterimplementsMyObserver{
publicCautionLightcautionLight=newCautionLight();
@Override
publicvoidupdate(){
cautionLight.flicker();
}
}
publicclassCautionLight{
publicvoidflicker(){
System.out.println("警示灯将闪烁");
}
}
publicclassInsulatedDoorAdapterimplementsMyObserver{
publicInsulatedDoorinsulatedDoor=newInsulatedDoor();
@Override
publicvoidupdate(){
insulatedDoor.close();
}
}
publicclassInsulatedDoor{
publicvoidclose(){
System.out.println("隔热门自动关闭");
}
}
publicclassSecurityDoorAdapterimplementsMyObserver{
publicSecurityDoorsecurityDoor=newSecurityDoor();
@Override
publicvoidupdate(){
securityDoor.open();
}
}
publicclassSecurityDoor{
publicvoidopen(){
System.out.println("安全逃生门自动开启");
}
}
3.类图:
实现代码:
importutil.XMLUtil;
publicclassClient{
publicstaticvoidmain(String[]args){
TicketingSystemticketingSystem=newTicketingSystem();
MovieTicketticket=(MovieTicket)XMLUtil.getBean();
ticketingSystem.setTicketKiind(ticket);
ticketingSystem.sale();
}
}
publicinterfaceMovieTicket{
voidsale();
}
publicclassTicketingSystem{
privateMovieTicketmovieTicket;
publicvoidsetTicketKiind(MovieTicketmovieTicket){
this.movieTicket=movieTicket;
}
publicvoidsale(){
movieTicket.sale();
}
}
publicclassChildTicketimplementsMovieTicket{
publicvoidsale(){
System.out.println("享受每张票减免10元的优惠");
}
}
publicclassStudentTicketimplementsMovieTicket{
publicvoidsale(){
System.out.println("享受票价8折优惠");
}
}
publicclassVIPTicketimplementsMovieTicket{
publicvoidsale(){
System.out.println("享受票价半价优惠外还可进行积分");
}
}
packageutil;
importjava.io.File;
importjava.io.IOException;
importjavax.xml.parsers.DocumentBuilder;
importjavax.xml.parsers.DocumentBuilderFactory;
importjavax.xml.parsers.ParserConfigurationException;
importorg.w3c.dom.Document;
importorg.w3c.dom.Node;
importorg.w3c.dom.NodeList;
importorg.xml.sax.SAXException;
publicclassXMLUtil{
publicstaticObjectgetBean(){
try{
//创建DOM文档对象
DocumentBuilderFactorydocFactory=DocumentBuilderFactory.newInstance();
DocumentBuilderdocBuilder=docFactory.newDocumentBuilder();
Documentdocument=docBuilder.parse(newFile("config.xml"));
//获取包含类名的文本节点
NodeListnl=document.getElementsByTagName("className");
NodeclassNode=nl.item(0).getFirstChild();
StringclassName=classNode.getNodeValue();
//通过类名生成实例对象并将其返回
@SuppressWarnings("rawtypes")
Classclazz=Class.forName(className);
Objectobj=clazz.newInstance();
returnobj;
}catch(ParserConfigurationExceptione){
e.printStackTrace();
}catch(SAXExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}catch(ClassNotFoundExceptione){
e.printStackTrace();
}catch(InstantiationExceptione){
e.printStackTrace();
}catch(IllegalAccessExceptione){
e.printStackTrace();
}
returnnull;
}
}
xmlversion="1.0"encoding="UTF-8"?
>
4.类图:
实现代码:
importutil.XMLUtil;
publicclassClient{
publicstaticvoidmain(String[]args){
TakeOfftakeOff=(TakeOff)XMLUtil.getBean("takeOff");
Flyfly=(Fly)XMLUtil.getBean("fly");
Aircraftaircraft=newAircraft("直升机",takeOff,fly);
System.out.println("今天是国庆,接下下来是"+aircraft.getKind()+"方阵");
aircraft.takeOff();
aircraft.fly();
}
}
publicclassAircraft{
privateStringkind;
privateTakeOfftakeOff;
privateFlyfly;
publicAircraft(Stringkind,TakeOfftakeOff,Flyfly){
this.kind=kind;
this.takeOff=takeOff;
this.fly=fly;
}
publicvoidtakeOff(){
takeOff.takeOff();
}
publicvoidfly(){
fly.fly();
}
publicStringgetKind(){
returnkind;
}
}
publicabstractclassFly{
publicvoidfly(){
}
}
publicabstractclassTakeOff{
publicvoidtakeOff(){
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计 模式 软件 体系结构 实验 中南 大学 学院