代理模式的实现

问题

       某软件公司承接了某信息咨询公司的收费商务信息查询系统的开发任务,该系统的基本需求如下:

       (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"));
    }
}

通过代理类实现了对查询方法权限的校验和日志的保存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

财大彭于晏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值