代理模式(Proxy Pattern)

定义

为其他对象提供一种代理以控制对这个对象的访问。

使用场景

当某个对象无法被直接访问或直接访问存在困难时,可以通过一个代理对象来间接访问此委托对象。为了保证客户端调用的透明性,被委托对象与代理对象需要实现相同的接口。

UML类图

代理模式-w554

Subject:抽象主题类。

  • 此类的主要职责是声明真实主题与代理主题的共同接口方法。

  • 此类可以是接口或抽象类。

RealSubject:真实主题类。

  • 此类也被称为被委托类或被代理类。

  • 此类定义了代理所表示的真实对象,由其执行具体的业务逻辑方法,而客户类则通过代理类间接地调用这个真实对象中的方法。

ProxySubject:代理主题类。

  • 此类也被称为委托类或代理类。

  • 此类持有一个对真实主题类对象的引用。在其所实现的接口方法中调用真实主题类对象中相应的接口方法来执行,以起到代理的作用。

代理模式的常见实现

/** 抽象主题 */
public interface Subject {
    void visit();
}
1
2
3
4
/** 真实主题 */
public class RealSubject implements Subject {
    
    public void visit() {
    }
}
1
2
3
4
5
6
/** 代理主题 */
public class ProxySubject implements Subject {
    private Subject subject;
    
    public ProxySubject(Subject subject) {
        this.subject = subject;
    }
    
    public void visit() {
        subject.visit();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
/** Client */
Subject realSubject = new RealSubject();
Subject proxySubject = new ProxySubject(realSubject);
proxySubject.visit();
1
2
3
4

代理模式的分类

代理模式可分为静态代理动态代理

静态代理就像上述示例那样,代理者的代码由开发者自己或通过一些自动化工具生成固定的代码,再对其进行编译。即在代码运行前,代理类的class编译文件就已存在。

动态代理是在运行时动态构建代理、动态处理代理方法调用的机制,即在code阶段不需要知道代理谁,代理谁将会在代码运行阶段才决定。