设计模式实验五Word格式.docx
- 文档编号:21200249
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:21
- 大小:334KB
设计模式实验五Word格式.docx
《设计模式实验五Word格式.docx》由会员分享,可在线阅读,更多相关《设计模式实验五Word格式.docx(21页珍藏版)》请在冰豆网上搜索。
该软件公司开发人员已完成了商务信息查询模块的开发任务,现希望能够以一种松耦合的方式向原有系统增加身份验证和日志记录功能,客户端代码可以无区别地对待原始的商务信息查询模块和增加新功能之后的商务信息查询模块,而且可能在将来还要在该信息查询模块中增加一些新的功能。
试使用代理模式设计并编程模拟实现该收费商务信息查询系统。
【提示:
使用保护代理和智能引用代理】
3.某企业的SCM(SupplyChainManagement,供给链管理)系统中包含一个采购审批子系统。
该企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批,主任可以审批5万元以下〔不包括5万元〕的采购单,副董事长可以审批5万元至10万元〔不包括10万元〕的采购单,董事长可以审批10万元至50万元〔不包括50万元〕的采购单,50万元及以上的采购单就需要开董事会讨论决定。
如下列图所示:
试使用职责链模式设计并实现该系统。
4.某公司欲开发一个软件系统的在线文档帮助系统,用户可以在任何一个查询上下文中输入查询关键字,如果当前查询环境下没有相关内容,那么系统会将查询按照一定的顺序转发给其他查询环境。
基于上述需求,试采用职责链模式对该系统进行设计。
5.房间中的开关就是命令模式的一个实例,现用命令模式来模拟开关的功能,可控制对象包括电灯和电风扇,绘制相应的类图并编程模拟实现。
6.某软件公司欲开发一个基于Windows平台的公告板系统。
系统提供一个主菜单(Menu),在主菜单中包含了一些菜单项(MenuItem),可以通过Menu类的addMenuItem()方法增加菜单项。
菜单项的主要方法是click(),每一个菜单项包含一个抽象命令类,具体命令类包括OpenCommand(翻开命令),CreateCommand(新建命令),EditCommand(编辑命令)等,命令类具有一个execute()方法,用于调用公告板系统界面类(BoardScreen)的open()、create()、edit()等方法。
现使用命令模式设计该系统,使得MenuItem类与BoardScreen类的耦合度降低,绘制类图并编程实现。
三、实验要求
1.结合实例,正确无误地绘制代理模式、职责链模式和命令模式的模式结构图;
2.使用任意一种面向对象编程语言实现代理模式、职责链模式和命令模式实例,代码运行正确无误。
四、实验步骤
1.结合实例,使用PowerDesigner绘制代理模式实例结构图并用面向对象编程语言实现该模式实例;
2.结合实例,使用PowerDesigner绘制代理模式实例结构图并用面向对象编程语言实现该模式实例;
3.结合实例,使用PowerDesigner绘制职责链模式实例结构图并用面向对象编程语言实现该模式实例;
4.结合实例,使用PowerDesigner绘制职责链模式实例结构图并用面向对象编程语言实现该模式实例;
5.结合实例,使用PowerDesigner绘制命令模式实例结构图并用面向对象编程语言实现该模式实例;
6.结合实例,使用PowerDesigner绘制命令模式实例结构图并用面向对象编程语言实现该模式实例。
五、实验结果
1.类图:
实现代码:
AbstractLog.java
publicinterfaceAbstractLog{
publicvoidmethod();
}
LogProxy.java
importjava.text.SimpleDateFormat;
importjava.util.Date;
publicclassLogProxyimplementsAbstractLog{
privateLogRecordlogRecord=newLogRecord();
privateSimpleDateFormatSDF=newSimpleDateFormat("
yyyy-MM-ddHH:
mm:
ss"
);
privateStringtime=SDF.format(newDate());
publicvoidmethod(){
System.out.println("
方法Method被调用,调用时间为:
"
+time);
try{
logRecord.method();
System.out.println("
方法method()调用成功"
}catch(Exceptione){
System.out.println("
方法method()调用失败"
}
LogRecord.java
publicclassLogRecordimplementsAbstractLog{
真实业务方法"
}
XMLUtil.java
importjavax.xml.parsers.*;
importorg.w3c.dom.*;
importjava.io.*;
publicclassXMLUtil
{
//该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象
publicstaticObjectgetBean()
{
try
//创立DOM文档对象
DocumentBuilderFactorydFactory=DocumentBuilderFactory.newInstance();
DocumentBuilderbuilder=dFactory.newDocumentBuilder();
Documentdoc;
doc=builder.parse(newFile("
src/config.xml"
));
//获取包含类名的文本节点
NodeListnl=doc.getElementsByTagName("
className"
NodeclassNode=nl.item(0).getFirstChild();
StringcName=classNode.getNodeValue();
//通过类名生成实例对象并将其返回
Classc=Class.forName(cName);
Objectobj=c.newInstance();
returnobj;
catch(Exceptione)
e.printStackTrace();
returnnull;
Client.java
publicclassClient{
publicstaticvoidmain(String[]args){
AbstractLogal;
al=(AbstractLog)XMLUtil.getBean();
al.method();
2.类图:
AbstractSearch.java
publicinterfaceAbstractSearch{
Stringsearch(Stringuid);
SearchProxy.java
publicclassSearchProxyimplementsAbstractSearch{
privateRealSearchrealSearch=newRealSearch();
privateValidatorvalidator;
publicStringsearch(Stringuid){
if(Validate(uid)){
Stringresult=realSearch.search(uid);
Log(uid);
returnresult;
else
privatevoidLog(Stringuid){
记录日志"
privatebooleanValidate(Stringuid){
validator=newValidator();
returnvalidator.validate(uid);
RealSearch.java
publicclassRealSearchimplementsAbstractSearch{
System.out.println(uid+"
在进行具体查询"
return"
具体查询内容"
;
Validator.java
publicclassValidator{
publicbooleanvalidate(Stringuid){
if(uid=="
uid"
){
验证通过"
returntrue;
验证失败"
returnfalse;
AbstractSearchas;
as=(AbstractSearch)XMLUtil.getBean();
as.search("
3.类图:
实现代码:
Leader.java
publicabstractclassLeader{
protectedLeadersuccessor;
protectedStringname;
publicLeader(){
publicabstractvoidhandleRequest(PurchaseRequestpRequest);
publicLeader(Stringname){
this.name=name;
publicvoidsetSuccessor(Leadersuccessor){
this.successor=successor;
Director.java
publicclassDirectorextendsLeader{
publicDirector(Stringname){
super(name);
publicvoidhandleRequest(PurchaseRequestpRequest){
if(pRequest.getMoney()<
50000)
主任"
+this.name+"
审批采购单,采购金额为"
+pRequest.getMoney());
elseif(this.successor!
=null)
this.successor.handleRequest(pRequest);
}
Manager.java
publicclassManagerextendsLeader{
publicManager(Stringname){
100000)
副董事长"
GeneralManager.java
publicclassGeneralManagerextendsLeader{
publicGeneralManager(Stringname){
500000)
董事长"
BoardOfDirectors.java
publicclassBoardOfDirectorsextendsLeader{
publicBoardOfDirectors(){
董事会讨论决定是否批准采购单,采购金额为"
publicclassPurchaseRequest{
privatedoublemoney;
publicPurchaseRequest(doublemoney){
this.money=money;
publicdoublegetMoney(){
returnmoney;
publicvoidsetMoney(doublenewMoney){
money=newMoney;
Leaderl1,l2,l3,l4;
PurchaseRequestpr1,pr2,pr3,pr4,pr5;
l1=newDirector("
张三"
l2=newManager("
李四"
l3=newGeneralManager("
王五"
l4=newBoardOfDirectors();
pr1=newPurchaseRequest(20000);
pr2=newPurchaseRequest(60000);
pr3=newPurchaseRequest(120000);
pr4=newPurchaseRequest(520000);
l1.setSuccessor(l2);
l2.setSuccessor(l3);
l3.setSuccessor(l4);
l1.handleRequest(pr1);
l1.handleRequest(pr2);
l1.handleRequest(pr3);
l1.handleRequest(pr4);
4.类图:
SearchContext.java
publicabstractclassSearchContext{
protectedSearchContextsuccessor;
publicvoidsetSuccessor(SearchContextsuccessor){
publicabstractvoidsearch(Stringkey);
SearchContext1.java
publicclassSearchContext1extendsSearchContext{
publicvoidsearch(Stringkey){
if(key=="
key1"
)
在Context1中查到相关内容"
elseif(this.successor!
this.successor.search(key);
SearchContext2.java
publicclassSearchContext2extendsSearchContext{
key2"
在Context2中查到相关内容"
else
未查到相关内容"
SearchContextsc1,sc2;
sc1=newSearchContext1();
sc2=newSearchContext2();
sc1.setSuccessor(sc2);
sc1.search("
5.类图:
Switch.java
publicclassSwitch{
privateAbstractCommandabstractCommand;
publicvoidsetComman(AbstractCommandabstractCommand){
this.abstractCommand=abstractCommand;
publicvoidopen(){
abstractCommand.open();
publicvoidclose(){
abstractCommand.close();
AbstractCommand.java
publicabstractclassAbstractCommand{
publicabstractvoidopen();
publicabstractvoidclose();
FunCommand.java
publicclassFunCommandextendsAbstractCommand{
privateFunfun=newFun();
fun.open();
fun.close();
LightCommand.java
publicclassLightCommandextendsAbstractCommand{
privateLightlight=newLight();
light.open();
light.close();
Fun.java
publicclassFun{
开风扇"
关风扇"
Light.java
publicclassLight{
开灯"
关灯"
Switchs=newSwitch();
AbstractCommandac;
ac=(AbstractCommand)XMLUtil.getBean();
s.setComman(ac);
s.open();
s.close();
6.类图:
Menu.java
importjava.util.ArrayList;
publicclassMenu{
publicArrayList<
MenuItem>
menuItemList=newArrayList<
();
publicvoidaddMenuItem(MenuItemmenuItem){
menuItemList.add(menuItem);
System.out.println(menuItem.getName()+"
功能参加主菜单"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计 模式 实验