代理模式(Proxy Pattern)详解

  1. 概述 代理模式是一种结构型设计模式,它允许你提供一个代理对象来控制对另一个对象的访问。代理模式的主要目的是在不改变原始对象的情况下,增加额外的功能或控制。
  2. 代理模式的用途 延迟初始化:在需要时才创建昂贵的对象。 控制访问:限制对对象的访问,例如,基于用户权限。 日志记录:在调用方法前后记录日志。 缓存:缓存结果以减少资源消耗。 网络通信:作为远程服务的本地代表。
  3. 代理模式的结构 代理模式通常涉及以下角色: Subject:定义了 RealSubject 和 Proxy 的公共接口,使得它们可以在任何使用 RealSubject 的地方使用 Proxy。 RealSubject:实际执行任务的对象。 Proxy:持有 RealSubject 的引用,并在需要时调用 RealSubject 的方法。Proxy 可以在调用前后添加额外的操作。
  4. 示例代码 假设我们有一个 Image 接口和两个实现类:RealImage 和 ProxyImage。 4.1 定义 Subject 接口
public interface Image {
    void display();
}

4.2 实现 RealSubject

public class RealImage implements Image {
    private String fileName;

    public RealImage(String fileName) {
        this.fileName = fileName;
        loadFromDisk(fileName);
    }

    @Override
    public void display() {
        System.out.println("Displaying " + fileName);
    }

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

4.3 实现 Proxy

public class ProxyImage implements Image {
    private String fileName;
    private RealImage realImage;

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

    @Override
    public void display() {
        if (realImage == null) {
            realImage = new RealImage(fileName);
        }
        realImage.display();
    }
}

4.4 使用代理模式

public class ImageClient {
    public static void main(String[] args) {
        Image image1 = new ProxyImage("high-res.jpg");
        Image image2 = new ProxyImage("low-res.jpg");

        image1.display(); // 加载并显示 high-res.jpg
        image2.display(); // 加载并显示 low-res.jpg
        image1.display(); // 直接显示 high-res.jpg,无需重新加载
    }
}
  1. 代理模式的优点 延迟初始化:只有在需要时才创建和加载对象,节省资源。 控制访问:可以在访问对象之前或之后执行额外的操作,如权限检查、日志记录等。 增强功能:可以在不修改原始对象的情况下,增加新的功能。
  2. 代理模式的缺点 复杂性增加:引入了额外的类和对象,增加了系统的复杂性。 性能开销:每次访问对象都需要通过代理,可能会增加一定的性能开销。
  3. 总结 代理模式是一种非常实用的设计模式,适用于需要在不改变原始对象的情况下,增加额外功能或控制访问的场景。通过合理使用代理模式,可以提高代码的灵活性和可维护性。