毅四捕Go设计模式笔记——代理模式

代理模式(Proxy Pattern)

为了解决什么问题?

代理模式用于在不直接访问实际对象的情况下,通过引入一个代理对象来控制和管理对该对象的访问。主要解决的问题是对原始对象的访问控制,以及在不改变原始对象接口的情况下添加额外的功能。

怎么用代码实现?

下面是Java代码示例,先定义接口类及其实现:

java 复制代码
/**
 * 抽象目标对象
 */
interface Target {
    void request();
}

/**
 * 真实目标对象
 */
class RealTarget implements Target {
    @Override
    public void request() {
        System.out.println("RealTarget: Handling request.");
    }
}

然后,使用代理类对接口进行包装:

java 复制代码
/**
 * 代理类
 */
class Proxy implements Target {
    private RealTarget realTarget;

    @Override
    public void request() {
        if (realTarget == null) {
            realTarget = new RealTarget();
        }
        preRequest();
        realTarget.request(); // 调用真实主题对象的方法
        postRequest();
    }

    private void preRequest() {
        System.out.println("Proxy: Preprocessor before request.");
    }

    private void postRequest() {
        System.out.println("Proxy: Postprocessor after request.");
    }
}

最后,调用代理类:

java 复制代码
/**
 * 客户端代码
 */
public class Client {
    public static void main(String[] args) {
        Proxy proxy = new Proxy();
        proxy.request();
    }
}

为什么可以解决这个问题?

通过引入代理对象,可以在不修改真实对象的情况下,在方法调用前后添加额外的处理逻辑(例如权限检查、延迟初始化、日志记录、缓存等),保持客户端和真实对象间的解耦。

这使得代码符合单一职责原则,并增加了系统的可维护性和扩展性。

代理模式适用于哪些场景?

延迟加载(虚拟代理):当一个对象的加载代价很大时,可以使用代理模式进行延迟加载,只有在实际需要使用该对象时,代理才创建真实对象。

访问控制(保护代理):当在某些操作需要特定权限时,代理可以控制对实际对象的访问。

日志和记录(日志代理):代理可以记录对真实对象的访问,并提供审计功能。

智能引用:代理可以在没有其他对象引用时自动释放真实对象,管理生命周期。

代理模式在开源代码的实际应用案例有:

Spring AOP:Spring框架中的面向切面编程(AOP)使用代理模式来实现方法拦截并添加额外行为,如安全检查或事务管理。

Hibernate:hibernate在对象关系映射(ORM)中使用代理模式来实现数据懒加载,即对象的关联属性在实际被访问时才从数据库加载。

代理模式是常见的设计模式之一,在需要对对象的访问进行控制或者额外操作时尤其有用。它在满足设计原则的同时,为应用程序提供了更加灵活和强大的功能。

---------------------------------这是分割线---------------------------------

欢迎添加博主vx深入交流:

相关推荐
孟婆来包棒棒糖~22 分钟前
Maven快速入门
java·spring boot·spring·maven·intellij-idea
jingfeng5143 小时前
C++模板进阶
java·c++·算法
杨杨杨大侠3 小时前
附录 1:[特殊字符] Maven Central 发布完整指南:从零到成功部署
java·spring boot·maven
ahauedu3 小时前
AI资深 Java 研发专家系统解析Java 中常见的 Queue实现类
java·开发语言·中间件
暗流者3 小时前
AAA 服务器与 RADIUS 协议笔记
运维·服务器·笔记
小厂永远得不到的男人4 小时前
基于 Spring Validation 实现全局参数校验异常处理
java·后端·架构
计算机编程小咖4 小时前
《基于大数据的农产品交易数据分析与可视化系统》选题不当,毕业答辩可能直接挂科
java·大数据·hadoop·python·数据挖掘·数据分析·spark
艾莉丝努力练剑4 小时前
【C语言16天强化训练】从基础入门到进阶:Day 7
java·c语言·学习·算法
Ro Jace4 小时前
科研笔记:博士生手册
笔记