问题
某软件公司承接了某信息咨询公司的收费商务信息查询系统的开发任务,该系统的基本需求如下:
(1) 在进行商务信息查询之前用户需要通过身份验证,只有合法用户才能够使用该查询系统;
(2) 在进行商务信息查询时系统需要记录查询日志,以便根据查询次数收取查询费用。
该软件公司开发人员已完成了商务信息查询模块的开发任务,现希望能够以一种松耦合的方式向原有系统增加身份验证和日志记录功能,客户端代码可以无区别地对待原始的商务信息查询模块和增加新功能之后的商务信息查询模块,而且可能在将来还要在该信息查询模块中增加一些新的功能。
试使用代理模式设计并实现该收费商务信息查询系统。
package com.liyajie.Pattern.ProxyPattern;
/**
* 抽象查询类,充当抽象主题角色,它声明了DoSearch()方法。
* @author 李亚杰
* @date 2024/4/17 11:46
* @description Searcher
*/
public abstract class Searcher {
protected abstract String doSearch(String id);
}
package com.liyajie.Pattern.ProxyPattern;
/**
* 具体查询类,充当真实主题角色,它实现查询功能,提供方法DoSearch()来查询信息。
* @author 李亚杰
* @date 2024/4/17 11:46
* @description RealSearcher
*/
public class RealSearcher extends Searcher{
@Override
protected String doSearch(String id) {
System.out.println("查询到用户:"+id);
return "over";
}
}
package com.liyajie.Pattern.ProxyPattern;
/**
* 身份验证类,业务类,它提供方法Validate()来实现身份验证。
* @author 李亚杰
* @date 2024/4/17 11:43
* @description AccessValidator
*/
public class AccessValidator {
public boolean validate(String message){
return message.equals("123456");
}
}
package com.liyajie.Pattern.ProxyPattern;
/**
* 日志记录类,业务类,它提供方法Log()来保存日志。
* @author 李亚杰
* @date 2024/4/17 11:45
* @description Logger
*/
public class Logger {
public void log(String log){
System.out.println("已保存日志:"+log);
}
}
package com.liyajie.Pattern.ProxyPattern;
/**
* 代理查询类,充当代理主题角色,它是查询代理,维持了对RealSearcher对象、AccessValidator对象和Logger对象的引用。
* @author 李亚杰
* @date 2024/4/17 11:48
* @description ProxySample
*/
public class ProxySample {
private Searcher realSearcher;
private AccessValidator accessValidator;
private Logger logger;
public ProxySample() {
this.realSearcher = new RealSearcher();
this.accessValidator = new AccessValidator();
this.logger = new Logger();
}
public String doSearch(String id,String message){
if (!accessValidator.validate(message)) return "没有权限";
String s = realSearcher.doSearch("1");
logger.log("1");
return s;
}
}
package com.liyajie.Pattern.ProxyPattern;
/**
* 测试
* @author 李亚杰
* @date 2024/4/17 11:52
* @description Clint
*/
public class Clint {
public static void main(String[] args) {
ProxySample proxySample = new ProxySample();
System.out.println(proxySample.doSearch("1", "123456"));
}
}
通过代理类实现了对查询方法权限的校验和日志的保存