Java设计模式之代理模式(Proxy)

99 阅读2分钟

代理模式(Proxy Pattern)是一种结构型设计模式,用于为其他对象提供一个代替或占位符以控制对它的访问。代理可以在客户端和目标对象之间起到中介的作用,这样在某些情况下可以延迟对象的创建,或者在访问对象时添加额外的功能。

代理模式包含以下几个关键角色:

  1. Subject(主题接口) :定义了真实主题和代理共同实现的接口。
  2. RealSubject(真实主题) :定义了代理所代表的真实对象,实现了主题接口。
  3. Proxy(代理) :包含对真实主题的引用,实现了和真实主题相同的接口,并在访问真实主题之前或之后添加额外的处理。

代理模式的典型代码结构如下:

// 主题接口
interface Subject {
    void request();
}

// 真实主题
class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("RealSubject: Handling request.");
    }
}

// 代理
class Proxy implements Subject {
    private RealSubject realSubject;

    public Proxy() {
        this.realSubject = null;
    }

    public void request() {
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        realSubject.request();
        // 可以添加额外的处理逻辑
    }
}

使用代理模式的示例:

public class ProxyDemo {
    public static void main(String[] args) {
        Subject proxy = new Proxy();
        proxy.request(); // 代理对象处理请求
    }
}

输出结果:

RealSubject: Handling request.

代理模式的优点包括:

  • 控制访问:可以在访问真实主题之前或之后添加控制逻辑。
  • 延迟初始化:可以在真正需要时才创建真实主题对象,节省资源。
  • 增加额外功能:可以在不修改真实主题的情况下,通过代理添加额外的功能。

代理模式的缺点包括:

  • 增加复杂性:每增加一个代理,就需要增加一个代理类。
  • 降低性能:代理模式可能会增加系统的性能开销。

代理模式适用于以下场景:

  • 当需要控制对某个对象的访问时。
  • 当需要为远程对象、或者创建开销较大的对象提供代表时。
  • 当需要通过代理来提供额外的功能,如日志记录、访问控制等。

代理模式有几种变体:

  1. 远程代理:为远程对象提供代理,隐藏对象位于不同地址空间的事实。
  2. 虚拟代理:延迟创建开销较大的对象。
  3. 保护代理:控制对原始对象的访问权限。
  4. 智能引用:在访问对象时执行额外操作,如引用计数、线程安全等。