代理设计模式

设计模式 - 代理模式

代理设计模式(Proxy Design Pattern) 是创建型设计模式的一种,它提供了一个代理对象来控制对一个真实对象的访问。这个设计模式的主要目的是为了在不需要修改客户端代码的情况下,给某个对象提供一个代替接口。代理模式通常用来实现延迟加载、虚拟代理、远程代理等功能。下面来讨论一下代理模式的主要组成部分:

组成部分:

  1. Subject(主题接口/抽象类):
    • 这是真实对象以及代理对象共同遵循的接口或者抽象类。它定义了真实对象以及代理对象需要实现的方法。
  2. RealSubject(真实对象):
    • 这是实际执行请求的对象,通常包含业务逻辑。
  3. Proxy(代理对象):
    • 它实现了与真实对象相同的接口,可以在客户端调用其方法时,选择是否将请求转发给真实对象。代理对象还可以在请求前后添加额外的操作。

这里举一个简单的例子来演示代理模式,并对目标方法实现功能增强!

public class ProxyPattern {
    public static void main(String[] args) {
        // 构建代理类对象,完成方法
        ProxyImage proxy = new ProxyImage("hello");
        proxy.show();
    }
}

// 代理类和真实类共同遵循的接口
interface Image{
    void show();
}

// 真实类
class RealImage implements Image {

    private final String imageName;
    public RealImage(String imageName) {
        this.imageName = imageName;
        loadFromDisk(imageName);
    }

    private void loadFromDisk(String imageName) {
        System.out.println("Loading image: "+ imageName);
    }


    @Override
    public void show() {
        System.out.println("Display image: "+ imageName);
    }
}

// 代理类
class ProxyImage implements Image {
    private RealImage realImage;
    private final String imageName;

    public ProxyImage(String imageName) {
        this.imageName = imageName;
    }

    @Override
    public void show() {
        System.out.println("Before...");    // 前置增强
        if (realImage == null) {
            realImage = new RealImage(imageName);
        }
        realImage.show();
        System.out.println("After...");     // 后置增强
    }
}

运行结果如下:

Before...
Loading image: hello
Display image: hello
After...

使用代理模式的好处:

  1. 降低耦合度:代理模式可以将真实对象与客户端进行分离,客户端仅仅需要和代理对象进行交互即可,无需直接和真实对象进行交互,从而降低了整个系统的耦合度。
  2. 保护真实对象:代理对象可以隐藏真实对象实现的具体细节,从而保护了真实对象。
  3. 增强目标对象功能:通过代理模式,可以在不改变真实对象目标代码的基础上对其进行功能增强,一个经典的例子就是Spring框架的AOP实现。

使用代理模式的坏处:

  1. 复杂性增加:代理模式会增加代码的复杂性,特别是在使用动态代理时,需要理解和处理动态生成的代理类。
  2. 性能降低:在客户端和真实对象之间增加一个代理对象会导致请求处理速度变慢。
  3. 类的个数增加:使用代理模式会增加系统中类的数量,增加了维护的难度。
posted @   LilyFlower  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
历史上的今天:
2021-10-29 springboot利用AOP记录每一次请求的日志
点击右上角即可分享
微信分享提示