毅四捕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深入交流:

相关推荐
思成不止于此20 小时前
深入理解 C++ 多态:从概念到实现的完整解析
开发语言·c++·笔记·学习·多态·c++40周年
RainbowSea20 小时前
内网穿透配置和使用
java·后端
RainbowSea20 小时前
13. Spring AI 的观测性
java·spring·ai编程
心之伊始21 小时前
Java synchronized 锁升级全过程深度解析:从 Mark Word 到偏向锁、轻量级锁与重量级锁的 HotSpot 实现
java·开发语言·word
谅望者21 小时前
数据分析笔记08:Python编程基础-数据类型与变量
数据库·笔记·python·数据分析·概率论
阿Y加油吧21 小时前
Java SE核心面试题总结——day 01
java
2021_fc1 天前
Flink入门指南:使用Java构建第一个Flink应用
java·大数据·flink
iiiiii111 天前
【论文阅读笔记】多实例学习方法 Diverse Density(DD):在特征空间中寻找正概念的坐标
论文阅读·人工智能·笔记·机器学习·ai·学习方法·多实例学习
inputA1 天前
【LwIP源码学习8】netbuf源码分析
android·c语言·笔记·嵌入式硬件·学习
JM丫1 天前
内网理论知识总结
笔记·网络安全