博客
关于我
[设计模式]代理模式
阅读量:532 次
发布时间: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/

    你可能感兴趣的文章
    上周热点回顾(5.3-5.9)
    查看>>
    【Bootstrap5】精细学习记录
    查看>>
    面试官:这些错误都没见过,还敢说会安装Elasticsearch?
    查看>>
    Java复习面试指南-06为什么要进行数据类型转换?什么情况下会进行自动类型转换?
    查看>>
    [源码解析] 并行分布式任务队列 Celery 之 EventDispatcher & Event 组件
    查看>>
    QQ框架的搭建
    查看>>
    Hololens2开发笔记-捕获照片到内存并上传至服务器(unity)
    查看>>
    OpenCV4(6)-LookUpTable(LUT)查找表(C++,Python,JS)
    查看>>
    SkyWalking性能剖析
    查看>>
    vue动态组件与插件到底是什么?
    查看>>
    python3下安装jupyter kernel报错问题
    查看>>
    mybatis 简单学习
    查看>>
    操作系统学科复习图
    查看>>
    LeetCode197.打家劫舍
    查看>>
    第7周编程作业
    查看>>
    A simple problem HDU-2522 【数学技巧】
    查看>>
    487-3279 POJ-1022【前导0~思维漏洞】
    查看>>
    D. Timofey and rectangles[四色定理]
    查看>>
    Problem C. Dynamic Graph Matching [状态压缩DP]
    查看>>
    ZOJ Problem Set - 2675 Little Mammoth[圆与多边形交]
    查看>>