博客
关于我
[设计模式]代理模式
阅读量:538 次
发布时间:2019-03-09

本文共 1743 字,大约阅读时间需要 5 分钟。

代理模式是一种设计策略,通过引入一个间接对象(代理类)来委派请求和执行方法代替直接作用于目标对象。这种模式在不暴露目标对象实例的前提下,允许对目标方法的执行过程进行检查、调试或修改。

几个核心概念:

  • 目标对象:拥有需要代理的功能或方法的对象或类。
  • 代理类:提供一个接口,使其能够调配目标对象,并在适当的时候执行额外的操作或处理。
  • 示例代码解析:

    接口定义

    public interface Sourceable {    public void method();}

    目标实现类

    public class Source implements Sourceable {    @Override    public void method() {        System.out.println("the original method!");    }}

    代理类实现

    public class Proxy implements Sourceable {    private Source source;    public Proxy() {        super();        this.source = new Source();    }    @Override    public void method() {        before();        source.method();        after();    }    private void after() {        System.out.println("after proxy!");    }    private void before() {        System.out.println("before proxy!");    }}

    功能解释:

    • 初始化:当 Proxy 对象创建时,内部初始化一个 Source 对象。
    • 方法执行前: Proxy 调用 before() 方法输出“before proxy!”。
    • 目标方法调用:调用源对象的 method(),打印“the original method!”。
    • 方法执行后: Proxy 调用 after() 方法输出“after proxy!”。

    优势分析:

  • 功能抽象:保持目标对象的接口不变,仅对实现进行扩展,可减少对现有代码的修改。
  • 控制流:在代理方法执行前后,可以根据需要添加各种控制逻辑,如日志记录、错误处理等。
  • 分离责任:将业务逻辑和控制逻辑分离,使每个部分有单独的职责,提高代码的可维护性。
  • 松耦合:在分布式系统中,通过引入代理,可以在不直接操作目标对象的情况下处理远程调用,减少远程调用相关的开销和复杂性。
  • 性能优化:可以在代理层面进行一些性能优化,如缓存、utzp等操作,与目标对象的执行相互隔离。
  • 注意事项:

    • 性能开销:每次通过代理调用目标方法,都会带来一定的性能开销,特别是在频繁调用或高性能需求的场景中,需权衡是否使用。
    • 线程安全:需要确保代理的同步机制与目标对象一致,避免因并发问题导致的不一致。
    • 异常处理:在代理层面需要良好的异常捕获和处理机制,将错误信息转化为友好的形式,避免传递原始错误到调用方。
    • 测试优化:在测试用例中,通过使用代理类,能更直观地测试目标对象的行为,而无需关心其具体实现。

    应用场景举例:

  • 远程控制:当需要远程访问一个不安全或受限的服务时,比如通过 Buch Bu API 调用,一个安全的 Proxy 可能被插入中进行身份验证和权限控制。

  • 日志记录:在不修改目标类的情况下,插入 Proxy 类进行日志记录。在调用目标方法前后,记录相关信息,便于日常运维和调试。

  • 功能扩展:如果希望在不破坏现有功能的前提下扩展更多功能,比如添加用户验证、权限管理或追踪功能等,使用 Proxy 是一个简单而有效的方法。

  • 总结:

    代理模式通过引入一个中间层,使得系统能够在不直接修改目标对象的情况下,扩展功能或增加行为控制。这种模式在保持系统的稳定性的同时,提高了可维护性和可扩展性。在实际应用中,需要根据项目需求权衡其优缺点,并对可能的性能和线程安全问题做好准备。

    转载地址:http://yweiz.baihongyu.com/

    你可能感兴趣的文章
    mysql 记录的增删改查
    查看>>
    MySQL 设置数据库的隔离级别
    查看>>
    MySQL 证明为什么用limit时,offset很大会影响性能
    查看>>
    mysql 递归查找父节点_MySQL递归查询树状表的子节点、父节点具体实现
    查看>>
    mysql 里对root及普通用户赋权及更改密码的一些命令
    查看>>
    Mysql 重置自增列的开始序号
    查看>>
    MySQL 高可用性之keepalived+mysql双主
    查看>>
    mysql5.6.21重置数据库的root密码
    查看>>
    MySQL5.6忘记root密码(win平台)
    查看>>
    mysql5.7 for windows_MySQL 5.7 for Windows 解压缩版配置安装
    查看>>
    MySQL5.7.18主从复制搭建(一主一从)
    查看>>
    MySQL5.7.19-win64安装启动
    查看>>
    mysql5.7性能调优my.ini
    查看>>
    Mysql5.7深入学习 1.MySQL 5.7 中的新增功能
    查看>>
    Mysql5.7版本单机版my.cnf配置文件
    查看>>
    mysql5.7的安装和Navicat的安装
    查看>>
    mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
    查看>>
    MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
    查看>>
    MySQL8修改密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
    查看>>
    MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案
    查看>>