本文档免注册免费下载
文档分类:
《设计模式》实验报告
×

广东金融学院实验报告

课程名称:设计模式

实验编号 及实验名称 实验六 代理模式及扩展 系 别 互联网金融与信息工程学院

姓 名 学 号 班 级 软工4班

实验地点 实验日期 2020年10月29日 实验时数 2

指导教师 同组其他成员 无 成 绩

一、实验目的及要求理解代理模式的结构。理解代理模式的作用及使用方法。能够应用代理模式的进行程序开发并扩展。

二、实验环境及相关情况(包含使用软件、实验设备、主要仪器及材料等)使用Eclipse或其他语言编写工具。

三、实验内容及要求根据问题描述和所给出的类图,建立Java控制台项目完成单例模式的应用,并在Main函数中进行测试。某软件公司承接了某信息咨询公司的收费商务信息查询系统的开发任务,该系统的基本需求如下: (1) 在进行商务信息查询之前用户需要通过身份验证,只有合法用户才能够使用该查询系统; (2) 在进行商务信息查询时系统需要记录查询日志,以便根据查询次数收取查询费用。该软件公司开发人员已完成了商务信息查询模块的开发任务,现希望能够以一种松耦合的方式向原有系统增加身份验证和日志记录功能,客户端代码可以无区别地对待原始的商务信息查询模块和增加新功能之后的商务信息查询模块,而且可能在将来还要在该信息查询模块中增加一些新的功能。现使用代理模式设计并实现该收费商务信息查询系统。代码可参见教材P208-211。观察上面的解决方案,代理类ProxySearcher与真实主题类RealSearcher是不是一一对应关系?若在Searcher家族树中增加一个真实主题类NewRealSearcher,如何实现对NewRealSearcher的代理,请写出代码。用Java动态代理实现如下实例:某软件公司欲为公司OA系统数据访问层DAO增加方法调用日志,记录每一个方法被调用的时间和调用结果,现使用动态代理进行设计和实现。代码可参见教材P214-216。

四、实验步骤及结果(请标清题号,可加页)1.运行结果如下:2.答:是一一对应关系,因为ProxySearch不具备普适性,若NewRealSearch由ProxySearch代理,则ProxySearch需要改动的代码较多,不符合开闭原则。NewRealSearcher代码如下:、package exp6; public class NewRealSearch implements Searcher { public String doSearcher(String userId, String keyword) { // TODO Auto-generated method stub System.out.println("用户" + userId +"使用关键词" + keyword +"查询商务信息 ,这是新的QAQ"); return "成功"; } } NewProxy代码如下:package exp6; public class NewProxySearch implements Searcher{ private NewRealSearch searcher = new NewRealSearch(); private AccessValidator validator; private Logger logger; @Override public String doSearcher(String userId, String keyword) { // TODO Auto-generated method stub if (this.validate(userId)) { String result = searcher.doSearcher(userId, keyword); this.log(userId); return result; } else { return null; } } public boolean validate(String userId) { validator = new AccessValidator(); return validator.validator(userId); } public void log(String userId) { logger = new Logger(); logger.log(userId); } }运行结果如下图:3.源代码如下:

package exp6_1; public interface AbstractDocumentDAO { public boolean deleteDocumentById(String document);} package exp6_1; public interface AbstractUserDAO { public boolean findUserById(String Id);} package exp6_1;import java.lang.reflect.Proxy; import javax.swing.text.AbstractDocument; import java.lang.reflect.InvocationHandler;public class Client { public static void main(String [] args) { InvocationHandler handler = null; AbstractUserDAO userDAO = new UserDAO(); handler = new DAOLogHandler(userDAO); AbstractUserDAO proxy = null; proxy = (AbstractUserDAO)Proxy.newProxyInstance(AbstractUserDAO.class.getClassLoader(), new Class[] {AbstractUserDAO.class}, handler); proxy.findUserById("张无忌"); System.out.println("------------------"); AbstractDocumentDAO documentDAO = new DocumentDAO(); handler = new DAOLogHandler(documentDAO); AbstractDocumentDAO proxy_new = null; proxy_new = (AbstractDocumentDAO)Proxy.newProxyInstance(AbstractDocumentDAO.class.getClassLoader(), new Class[] {AbstractDocumentDAO.class}, handler); proxy_new.deleteDocumentById("D002"); } } package exp6_1; import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.util.Calendar;import java.util.GregorianCalendar; public class DAOLogHandler implements InvocationHandler { private Calendar calender; private Object object; public DAOLogHandler() { } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method stub beforeInvoke(); Object result = method.invoke(object, args); afterInvoke(); return result; } public void afterInvoke() { // TODO Auto-generated method stub System.out.println("方法调用结束"); } public void beforeInvoke() { // TODO Auto-generated method stub calender = new GregorianCalendar(); int hour = calender.get(Calendar.HOUR_OF_DAY); int minute = calender.get(Calendar.MINUTE); int second = calender.get(Calendar.SECOND); String timeString = hour+":"+minute+":"+second; System.out.println("调用时间"+timeString); } //自定义有参构造函数,用户诸如一个需要提供代理的真实主题对象 public DAOLogHandler(Object object) { this.object = object; } } package exp6_1; public class DocumentDAO implements AbstractDocumentDAO{ @Override public boolean deleteDocumentById(String documentId) { // TODO Auto-generated method stub if (documentId.equalsIgnoreCase("D001")) { System.out.println("删除id为:"+documentId+"的文档信息成功"); return true; } else { System.out.println("删除id为:"+documentId+"的文档信息失败"); return false; } } } package exp6_1; public class UserDAO implements AbstractUserDAO { @Override public boolean findUserById(String userId) { // TODO Auto-generated method stub if (userId.equalsIgnoreCase("张无忌")) { System.out.println("查询id为"+userId+"的用户信息成功"); return true; } else { System.out.println("查询id为"+userId+"的用户信息失败"); } return false; } }运行结果如下

五、实验总结(包括心得体会、问题回答及实验改进意见)

六、教师评语 1、完成所有的实验内容,实验步骤和实验结果基本完全正确。 2、基本完成所有的实验内容,实验步骤和实验结果大部分正确。 3、至少完成大部分的实验内容,实验步骤和结果基本正确。 4、至少完成了主要实验内容,但是实验步骤和结果存在多处错误。 5、未能很好地完成规定的实验内容,且实验步骤和结果存在较多错误。 评定等级:■优秀 □良好 □中等 □及格 □不及格教师签名:卞琛 2020年 10 月 28 日

第 2 页 共 3 页

第 1 页 共 3 页