中南大学软件体系结构设计模式实验二全解.docx
《中南大学软件体系结构设计模式实验二全解.docx》由会员分享,可在线阅读,更多相关《中南大学软件体系结构设计模式实验二全解.docx(21页珍藏版)》请在冰豆网上搜索。
中南大学软件体系结构设计模式实验二全解
《软件体系结构》
实验报告
项目名称
设计模式实验2
专业班级
实验成绩:
批阅教师:
实验3设计模式实验
实验学时:
4
每组人数:
1
实验类型:
3
(1:
基础性
2:
综合性
3:
设计性
4:
研究性)
实验要求:
1
(1:
必修
2:
选修
3:
其它)
实验类别:
3
(1:
基础
2:
专业基础
3:
专业
4:
其它)
、实验目的
熟练使用PowerDesigner和任意一种面向对象编程语言实现几种常见的行为型设计模式,包括职责链模式、命令模式、观察者模式和策略模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式。
、实验内容
1.某企业的SCM(SuppiyChainManagement,供应链管理)系统中包含一个采购审批子
系统。
该企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来
审批,主任可以审批5万元以下(不包括5万元)的采购单,副董事长可以审批5万元至
10万元(不包括10万元)的采购单,董事长可以审批10万元至50万元(不包括50万元)
的采购单,50万元及以上的采购单就需要开董事会讨论决定。
如下图所示:
试使用职责链模式设计并模拟实现该系统。
2.房间中的开关是命令模式的一个实例,现用命令模式来模拟开关的功能,可控制对象包括电灯和电风扇,绘制相应的类图并编程模拟实现。
3.某软件公司欲开发一个基于Windows平台的公告板系统。
系统提供一个主菜单
(Menu),在主菜单中包含了一些菜单项(Menultem),可以通过Menu类的addMenultem()方
法增加菜单项。
菜单项的主要方法是click(),每一个菜单项包含一个抽象命令类,具体命
令类包括OpenCommand(打开命令),CreateCommand(新建命令),EditCommand(编辑命令)等,命令类具有一个execute()方法,用于调用公告板系统界面类(BoardScreen)的open()、
create。
、edit()等方法。
现使用命令模式设计该系统,使得Menultem类与BoardScreen类的
耦合度降低,绘制类图并编程实现。
4.某实时在线股票软件需要提供如下功能:
当股票购买者所购买的某支股票价格变化幅度达到5%时,系统将自动发送通知(包括新价格)给购买该股票的所有股民。
试使用观察者模式设计并实现该系统,要求绘制相应的类图并编程模拟实现。
5.某公司欲开发一套机房监控系统,如果机房达到某一指定温度,温度传感器
(Thermosensor)将自动传递信号给各种响应设备,例如警示灯(CautionLight)将闪烁(flicker。
)、
报警器(Annunciator)将发出警报(alarm())、安全逃生门(SecurityDoor)将自动开启(open())、隔热门(InsulatedDoor)将自动关闭(close())等,每一种响应设备的行为由专门的程序来控制。
为了将来能够方便地引入新类型的响应设备,采用观察者模式和适配器模式设计并模拟实现该系统。
6.某软件公司为某电影院开发了一套影院售票系统,在该系统中需要为不同类型的用户提供不同的电影票(MovieTicket)打折(Discount)方式,具体打折方案如下:
(1)学生凭学生证可享受票价8折优惠;
(2)年龄在10周岁及以下的儿童可享受每张票减免10元的优惠(原始票价需大于等
于20元);
(3)影院VIP用户除享受票价半价优惠外还可进行积分,积分累计到一定额度可换取电影院赠送的奖品。
该系统在将来可能还要根据需要引入新的打折方式。
试使用策略模式设计并编程模拟实现该影院售票系统。
7.为了实现一些特殊的显示效果,某公司欲开发一款手机数码照片处理软件,在该软
件中为照片(Photograph)提供了多种滤镜(Filter)效果,例如黑白滤镜(BlackWhiteFilter)、单色滤镜(MonochromaticFilter)、怀旧滤镜(NostalgicFilter)等,不同的滤镜通过不同的算法对照片进行美化,如下图所示。
g说4
皿厂3険
该软件可以灵活地增加一些新的滤镜效果。
选择一种合适的设计模式来设计该照片处理软件,结合场景绘制相应的类图并编程模拟实现。
三、实验要求
1.结合实例,正确无误地绘制职责链模式、命令模式、观察者模式和策略模式的模式结构图;
2.使用任意一种面向对象编程语言实现职责链模式、命令模式、观察者模式和策略模式实例,代码运行正确无误。
四、实验步骤
1.结合实例,实现该模式实例;
使用
PowerDesigner绘制职责链模式实例结构图并用面向对象编程语言
2.结合实例,现该模式实例;
使用
PowerDesigner绘制命令模式实例结构图并用面向对象编程语言实
3.结合实例,现该模式实例;
使用
PowerDesigner绘制命令模式实例结构图并用面向对象编程语言实
4.结合实例,实现该模式实例;
使用
PowerDesigner绘制观察者模式实例结构图并用面向对象编程语言
5.结合实例,实现该模式实例;
使用
PowerDesigner绘制观察者模式实例结构图并用面向对象编程语言
6.结合实例,现该模式实例;
使用
PowerDesigner绘制策略模式实例结构图并用面向对象编程语言实
7.结合实例,现该模式实例。
使用
PowerDesigner绘制策略模式实例结构图并用面向对象编程语言实
五、实验结果
1.类图:
PurchaseRequestamountnumberprupose
double,int「遙String
Approver
successor:
Approver
+setSuccessor(ApproveraSuccessor):
void
+processRequest(:
void
PurchaseRequestqRequest)
3
Congress
实现代码:
publicclassPurchaseRequest{
publicdoubleamount;
publicintnumber;
publicStringpurpose;
publicdoublegetAmount(){
returnamount;
}
publicvoidsetAmount(doubleamount){this.amount=amount;
}
publicintgetNumber(){returnnumber;
}
publicvoidsetNumber(intnumber){this,number=number;
}
publicStringgetPurpose(){returnpurpose;
}
publicvoidsetPurpose(Stringpurpose){this,purpose=purpose;
}publicclassApprover{
protectedApproversuccesor;
publicApprover(){
succesor=null;
}
publicvoidprocessRequest(PurchaseRequesaRequest){if(succesor!
=null){
succesor.processRequest(aRequest);
}
}
publicvoidsetSuccesor(Approversuccesor){this.succesor=succesor;
}
PublicclassCongressextendsApprover{publicvoidprocessRequest(PurchaseRequesrequest){if(request.getAmount()>=500000){
System.out.printing董事会");
}
publicclassDirectorextendsApprover{
publicvoidprocessRequest(PurchaseRequesrequest){if(request.getAmount()<50000){
System.out.println(”主任");
}else
if(thissuccesor!
=null){
this.succesor.processRequest(request);}
publicclassPresidentextendsApprover{
publicvoidprocessRequest(PurchaseRequesrequest){if(request.getAmount()<500000){
System.out.printin(”董事长");
}else
if(thissuccesor!
=null){
this.succesor.processRequest(request);}
publicclassVicePresidentextendsApprover{
publicvoidprocessRequest(PurchaseRequesrequest){if(request.getAmount()<100000){
System.out.printin(”副董事长");
}else
if(thissuccesor!
=null){
this.succesor.processRequest(request);}
y
AbstractCommand
{abstract}
SIriEIIhllIIhIIlliliII31-1Il-IEIIhllIIkl:
:
IIlllliII3liIrilHIhllIIh豆】J
excute():
void
publicabstractclassAbstractCommand{
publicabstractvoidopen();
publicabstractvoidclose();
}publicclassSwitch{
privateAbstractCommandcommand;
publicvoidsetCommand(AbstractCommandcommand){mand=command;
}
publicvoidopen(){
command.open();
}
publicvoidclose(){
command.close();
}
}publicclassFun{
publicvoidopen(){
System.out.println(”开风扇");}
publicvoidclose(){
System.out.println(”关风扇");
}
publicclasSLight{
publicvoidopen(){
System.out.println(”打开");}
publicvoidclose(){
System.outprintln("关灯”);}
}publicclassFunCommandextendsAbstractCommand{
privateFunfun=newFun();
©Override
publicvoidopen(){
//TODOAuto-generatedmethodstubfun.open();
}
©Override
publicvoidclose(){
//TODOAuto-generatedmethodstubfun.close();
publicclasSLightCommandextendsAbstractCommand{
privateLightlight=newLight();
©Override
publicvoidopen(){
//TODOAuto-generatedmethodstublight.open();
}
©Override
publicvoidclose(){
//TODOAuto-generatedmethodstublight.close();
3.类图:
BoardScreen
menu~:
Menu
Menu
-itemList:
ArrayList
+addMenultem(Menultemitem)~
■:
~void~
I■+BoardScreenI+display()
I+open0
I+create()
I+edit0
:
void
:
void
:
void
:
void
\j'iV
Menullem
-
name:
String
-
command:
Command
++
<>Menultem(Stringname)
+
getName()
String
+
setName()
void
+
getCommandO
Command
+
setCommand(Commandcommand)
void
+
click0
void
』mmand
+excute0==:
void
createcommand
screen:
BoardScreen
+CreateCommand(BoardScreenscreen)
+excute0
:
void
实现代码:
publicintefaceCommand{
publicvoidexcute();
publicclassMenultem{
privateStringname;
privateCommandcommand;
publicMenultem(Stringname){
this.name=name;
publicStringgetName(){
returnname;
publicvoidsetName(Stringname){
this.name=name;
publicCommandgetCommand(){
returncommand;
}
publicvoidsetCommand(Commandcommand){mand=command;
}
publicvoidclick(){
command.excute();
}
}
importjava.util.ArrayList;
publicclassMenu{
publicArrayListitemList=newArrayList();publicvoidaddMenultem(Menultemitem){itemList.add(item);
}
}
publicclassOpenCommandimplementsCommand{privateBoardScreenscreen;
publicOpenCommand(BoardScreenscreen){supei();
this.screen=screen;
}
©Override
publicvoidexcute(){
//TODOAuto-generatedmethodstubscreen.open();
publicclassCreateCommandimpiementsCommand{
privateBoardScreenscreen;
publicCreateCommand(BoardScreenscreen){supei();
this.screen=screen;
}
©Override
publicvoidexcuteQ{
//TODOAuto-generatedmethodstubscreen.create();
publicclassEidtCommandimplementsCommand{
privateBoardScreenscreen;
publicEidtCommand(BoardScreenscreen){supei();
this.screen=screen;
}
©Override
publicvoidexcute(){
//TODOAuto-generatedmethodstubscreen.edit();
publicclassBoardScreen{
privateMenumenu;
privateMenultemopenltem,createltem,editltem;
publicBoardScreen(){
menu=newMenu();openItem=newMenultem(”打开");createltem=newMenultem(”新建");editltem=newMenultem(”编辑");menu.addMenultem(openItem);
menu.addMenultem(createltem);menu.addMenultem(editltem);
}
publicvoiddisplay(){
System.out.println(”主菜单选项:
”);
for(Objectobj:
menu.itemList){
System.out.println(((Menultem)obj).getName());}
}
publicvoidopen(){
System.out.printin(”显示打开窗口!
”);
}
publicvoidcreate(){
System.out.println(”显示新建窗口!
");}
publicvoidedit(){
System.out.println(”显示编辑窗口!
");}
publicMenugetMenu(){
returnmenu;
}
}
4.类图:
Stock
-investors:
ArrayList
-stockName:
String
-price:
double
+Stock()
Investor
+attach(Investorinestor):
void
+detach(investorinvestor):
void
+nitifyInvestor():
void
十-
■^response~(Stock~stock)~void
实现代码:
publicintefaceInvestor{
publicvoidresponse(Stockstck);
}publicclassConcreteInvestorimpiementsinvestor{
privateStringname;
publicConcreteInvestor(Stringname){supei();
this.name=name;
}
©Override
publicvoidresponse(Stockstock){
//TODOAuto-generatedmethodstub
System.outprintln(name+":
");
System.out.println(stock.getStockName()+"涨幅超过5%");
System.out.println(”新价格"+stock.getPrice());
}}
importjava.util.ArrayList;
publicclassStock{
privateArrayListinvestors;
privateStringstockName;
privatedoubleprice;
publicStock(StringstockName,doubleprice){supei();
this.stockName=stockName;
this,price=price;
investors=newArrayList();
}
publicvoidattach(Investorinvestor){
investors.add(investor);
}
publicvoiddetach(Investorinvestor){
investors.remove(investor);
}
publicvoidnotifyInvestor(){for(Objectobj:
investors){
((Investor)obj).response(this);
}
}
publicStringgetStockName(){returnstockName;
}
publicvoidsetStockName(StringstockName){this.stockName=stockName;
}
publicdoublegetPrice(){returnprice;
}
publicvoidsetPrice(doubleprice){
doublerange=Math.abs(price-this.price)/thisprice;this,price=price;
if(range>=0.05){
thisnotifyInvestor();
}
}
publicclassClient{
publicstaticvoidmain(String[]args){
Investorinvestor1,investor2;
investorl=newConcreteInvestor("哈哈");
investor2=newConcreteInvestor("呵呵");
Stockhaier=newStock("haier",20.00);haier.attach(investor1);
haier.attach(investor2);
haier.setP