设计模式上机实验二实验报告.docx
- 文档编号:27398803
- 上传时间:2023-06-30
- 格式:DOCX
- 页数:42
- 大小:299.79KB
设计模式上机实验二实验报告.docx
《设计模式上机实验二实验报告.docx》由会员分享,可在线阅读,更多相关《设计模式上机实验二实验报告.docx(42页珍藏版)》请在冰豆网上搜索。
设计模式上机实验二实验报告
设计模式实验二
实验报 告书
专业班级软件0703
学号3901070324
姓名吉亚云
指导老师伟
时间2010年4月24日
中南大学软件学院
实验二设计模式上机实验二
一、实验目的
使用PowerDesigner和任意一种面向对象编程语言实现几种常用的设计模式,加深对这些模式的理解,包括装饰模式、外观模式、代理模式、职责链模式、命令模式、迭代器模式、观察者模式、状态模式、策略模式和模板方法模式。
二、实验内容
使用PowerDesigner和任意一种面向对象编程语言实现装饰模式、外观模式、代理模式、职责链模式、命令模式、迭代器模式、观察者模式、状态模式、策略模式和模板方法模式,包括根据实例绘制相应的模式结构图、编写模式实现代码,运行并测试模式实例代码。
三、实验要求
1.正确无误绘制装饰模式、外观模式、代理模式、职责链模式、命令模式、迭代器模式、观察者模式、状态模式、策略模式和模板方法模式的模式结构图;
2.使用任意一种面向对象编程语言实现装饰模式、外观模式、代理模式、职责链模式、命令模式、迭代器模式、观察者模式、状态模式、策略模式和模板方法模式,代码运行正确无误。
四、实验步骤
1.使用PowerDesigner绘制装饰模式结构图并用面向对象编程语言实现该模式;
2.使用PowerDesigner绘制外观模式结构图并用面向对象编程语言实现该模式;
3.使用PowerDesigner绘制代理模式结构图并用面向对象编程语言实现该模式;
4.使用PowerDesigner绘制职责链模式结构图并用面向对象编程语言实现该模式;
5.使用PowerDesigner绘制命令模式结构图并用面向对象编程语言实现该模式;
6.使用PowerDesigner绘制迭代器模式结构图并用面向对象编程语言实现该模式;
7.使用PowerDesigner绘制观察者模式结构图并用面向对象编程语言实现该模式;
8.使用PowerDesigner绘制状态模式结构图并用面向对象编程语言实现该模式;
9.使用PowerDesigner绘制策略模式结构图并用面向对象编程语言实现该模式;
10.使用PowerDesigner绘制模板方法模式结构图并用面向对象编程语言实现该模式。
五、实验报告要求
1.提供装饰模式结构图及实现代码;
2.提供外观模式结构图及实现代码;
3.提供代理模式结构图及实现代码;
4.提供职责链模式结构图及实现代码;
5.提供命令模式结构图及实现代码;
6.提供迭代器模式结构图及实现代码;
7.提供观察者模式结构图及实现代码;
8.提供状态模式结构图及实现代码;
9.提供策略模式结构图及实现代码;
10.提供模板方法模式结构图及实现代码。
六、实验结果
(1)装饰模式
某图书管理系统中,书籍类(Book)具有借书方法borrowBook()和还书方法returnBook()。
现需要动态给书籍对象添加冻结方法freeze()和遗失方法lose()。
使用装饰模式设计该系统,绘制类图并编程实现。
packageDirectorPattern;
interfaceBook
{
voidborrowBook();
voidreturnBook();
}
finalclassMyBookimplementsBook
{
publicvoidborrowBook(){
System.out.println("MyBookborrowing!
");
}
publicvoidreturnBook(){
System.out.println("MyBookreturning!
");
}
}
abstractclassBookDirectorimplementsBook
{
privateBookbook;
publicBookDirector(Bookbook)
{
System.out.println("Bookdirectoring!
");
this.book=book;
}
publicvoidborrowBook(){
book.borrowBook();
}
publicvoidreturnBook(){
book.returnBook();
}
}
classNewBookextendsBookDirector
{
publicNewBook(Bookbook)
{
super(book);
System.out.println("BookchangedtoNewBook!
");
}
publicvoidfreeze()
{
System.out.println("Bookfreezing!
");
}
publicvoidlose()
{
System.out.println("Booklost!
");
}
}
publicclassBookDirectorClient{
publicstaticvoidmain(Stringa[])
{
//半透明
Bookbook=newMyBook();
NewBooknewBook=newNewBook(book);
newBook.borrowBook();
newBook.returnBook();
newBook.freeze();
newBook.lose();
}
}
运行结果:
(2)外观模式
在电脑主机(Mainframe)中,只需要按下主机的开机按钮(on()),即可调用其他硬件设备和软件的启动方法,如内存(Memory)的自检(check()),CPU的运行(run()),硬盘(HardDisk)的读取(read()),操作系统(OS)的载入(load())等,如果某一过程发生错误则电脑启动失败。
使用外观模式模拟该过程,绘制类图并编程实现。
packageFacadePattern;
classMainframe{
privateMemorymemory;
privateCPUcpu;
privateHardDiskdisk;
privateOSos;
publicMainframe()
{
memory=newMemory();
cpu=newCPU();
disk=newHardDisk();
os=newOS();
}
publicvoidon()
{
memory.check();
cpu.run();
disk.read();
os.load();
}
publicvoidoff()
{
memory.off();
cpu.off();
disk.off();
os.off();
}
}
classMemory
{
publicvoidcheck()
{
System.out.println("Memorychecking!
");
}
publicvoidoff()
{
System.out.println("Memoryoff!
");
}
}
classCPU
{
publicvoidrun()
{
System.out.println("CPUrunning!
");
}
publicvoidoff()
{
System.out.println("CPUoff!
");
}
}
classHardDisk
{
publicvoidread()
{
System.out.println("HardDiskreading!
");
}
publicvoidoff()
{
System.out.println("HardDiskoff!
");
}
}
classOS
{
publicvoidload()
{
System.out.println("OSloading!
");
}
publicvoidoff()
{
System.out.println("OSoff!
");
}
}
publicclassComputerFacadeClient
{
publicstaticvoidmain(Stringargs[])
{
Mainframemainframe=newMainframe();
mainframe.on();
System.out.println("-----------------------");
mainframe.off();
}
}
运行结果:
(3)代理模式
应用软件所提供的桌面快捷方式是快速启动应用程序的代理,桌面快捷方式一般使用一张小图片来表示(Picture),通过调用快捷方式的run()方法将调用应用软件(Application)的run()方法。
使用代理模式模拟该过程,绘制类图并编程实现。
packageProxyPattern;
interfaceSoftware
{
voidrun();
}
classApplicationimplementsSoftware
{
publicvoidrun()
{
System.out.println("Applicationisrunning!
");;
}
}
classPictureimplementsSoftware
{
privateApplicationapp=newApplication();
publicvoidrun(){
app.run();
}
}
publicclassFastwayProxyClient
{
publicstaticvoidmain(Stringa[])
{
Softwareproxy=newPicture();
proxy.run();
}
}
运行结果:
(4)职责链模式
某物资管理系统中物资采购需要分级审批,主任可以审批1万元及以下的采购单,部门经理可以审批5万元及以下的采购单,副总经理可以审批10万元及以下的采购单,总经理可以审批20万元及以下的采购单,20万元以上的采购单需要开会确定。
现使用职责链模式设计该系统,绘制类图并编程实现。
packageChainResponsibilityPattern;
classShoppingRequest
{
privateStringshoppingReason;
privatedoublebillMoney;
publicShoppingRequest(StringshoppingReason,doublebillMoney)
{
this.shoppingReason=shoppingReason;
this.billMoney=billMoney;
}
publicStringgetShoppingReason(){
returnshoppingReason;
}
publicvoidsetShoppingReason(StringshoppingReason){
this.shoppingReason=shoppingReason;
}
publicdoublegetBillMoney(){
returnbillMoney;
}
publicvoidsetBillMoney(doublebillMoney){
this.billMoney=billMoney;
}
}
//抽象领导
abstractclassLeader
{
protectedStringname;
//上级领导
protectedLeadersuccessor;
publicLeader(Stringname)
{
this.name=name;
}
publicvoidsetSuccessor(Leadersuccessor)
{
this.successor=successor;
}
publicabstractvoidhandleRequest(ShoppingRequestrequest);
}
//主任
classDirectorextendsLeader
{
publicDirector(Stringname)
{
super(name);
}
publicvoidhandleRequest(ShoppingRequestrequest)
{
if(request.getBillMoney()<10000.00)
{
System.out.println("主任"+name+"处理物资采购:
"+request.getShoppingReason()+",批准采购资金为:
"+request.getBillMoney()+"RMB");
}
else
{
if(this.successor!
=null)
{
this.successor.handleRequest(request);
}
}
}
}
//部门经理
classDepartmentManagerextendsLeader
{
publicDepartmentManager(Stringname)
{
super(name);
}
publicvoidhandleRequest(ShoppingRequestrequest)
{
if(request.getBillMoney()<50000.00)
{
System.out.println("部门经理"+name+"处理物资采购:
"+request.getShoppingReason()+",批准采购资金为:
"+request.getBillMoney()+"RMB");
}
else
{
if(this.successor!
=null)
{
this.successor.handleRequest(request);
}
}
}
}
//副经理
classViceManagerextendsLeader
{
publicViceManager(Stringname)
{
super(name);
}
publicvoidhandleRequest(ShoppingRequestrequest)
{
if(request.getBillMoney()<100000.00)
{
System.out.println("副经理"+name+"处理物资采购:
"+request.getShoppingReason()+",批准采购资金为:
"+request.getBillMoney()+"RMB");
}
else
{
if(this.successor!
=null)
{
this.successor.handleRequest(request);
}
}
}
}
//总经理
classGeneralManagerextendsLeader
{
publicGeneralManager(Stringname)
{
super(name);
}
publicvoidhandleRequest(ShoppingRequestrequest)
{
if(request.getBillMoney()<200000.00)
{
System.out.println("总经理"+name+"处理物资采购:
"+request.getShoppingReason()+",批准采购资金为:
"+request.getBillMoney()+"RMB");
}
else
{
System.out.println("董事会将开会处理物资采购:
"+request.getShoppingReason()+",批准采购资金为:
"+request.getBillMoney()+"RMB");
}
}
}
publicclassStoreCoRClient
{
publicstaticvoidmain(Stringa[])
{
LeaderobjDirector,objDepartmentManager,objViceManager,objGeneralManager;
objDirector=newDirector("Jack");
objDepartmentManager=newDepartmentManager("刘德华");
objViceManager=newViceManager("张曼玉");
objGeneralManager=newGeneralManager("成龙");
objDirector.setSuccessor(objDepartmentManager);
objDepartmentManager.setSuccessor(objViceManager);
objViceManager.setSuccessor(objGeneralManager);
ShoppingRequestshopping1=newShoppingRequest("购买打印纸",1000.00);
System.out.println("----------------------------------------");
objDirector.handleRequest(shopping1);
ShoppingRequestshopping2=newShoppingRequest("办公室配置空调",25000.00);
System.out.println("----------------------------------------");
objDirector.handleRequest(shopping2);
ShoppingRequestshopping3=newShoppingRequest("更新电脑",80000.00);
System.out.println("----------------------------------------");
objDirector.handleRequest(shopping3);
ShoppingRequestshopping4=newShoppingRequest("车间维修",150000.00);System.out.println("----------------------------------------");
objDirector.handleRequest(shopping4);
ShoppingRequestshopping5=newShoppingRequest("收购RL公司",4000000.00);
System.out.println("----------------------------------------");
objDirector.handleRequest(shopping5);
}
}
运行结果:
(5)命令模式
某软件公司欲开发一个基于Windows平台的公告板系统。
系统提供一个主菜单(Menu),在主菜单中包含了一些菜单项(MenuItem),可以通过Menu类的addMenuItem()方法增加菜单项。
菜单项的主要方法是click(),每一个菜单项包含一个抽象命令类,具体命令类包括OpenCommand(打开命令),CreateCommand(新建命令),EditCommand(编辑命令)等,命令类具有一个execute()方法,用于调用公告板系统界面类(BoardScreen)的open()、create()、edit()等方法。
现使用命令模式设计该系统,使得MenuItem类与BoardScreen类的耦合度降低,绘制类图并编程实现。
packageCommandPattern;
importjava.util.ArrayList;
//菜单栏
classMenu
{
privateArrayList
publicvoidaddMenuItem(MenuItemitem){
this.menuItemList.add(item);
}
publicMenuItemgetMenuItemByName(StringitemName){
for(inti=0;i if(menuItemList.get(i).getItemName().equals(itemName)){ returnmenuItemList.get(i); } } returnnull; } } //请求发送者 classMenuItem { privateCommandcommand; privateStringitemName; MenuItem(Stringname,Commandcmd) { this.itemName=name; mand=cmd; } publicCommandgetCommand(){ returncommand; } publicvoidsetCommand(Commandcommand){ mand=command; } publicStri
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计 模式 上机 实验 报告