代理模式(Proxy Design Pattern)是为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象。被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象。
一、代理模式介绍
在结束创建型模式的讲解后,从这一篇开始就进入到了结构型模式,结构型模式主要是总结一些类和或对象组合在一起的结构。代理模式在不改变原始代理类的情况下,通过引入代理类来给原始类附加功能。
代理模式的主要结构如下:
-
Subject:抽象主题类,通过接口或抽象类声明主题和代理对象实现的业务方法
-
RealSubject:真实主题类,实现Subject中的具体业务,是代理对象所代表的真实对象
-
Proxy:代理类,其内部含有对真实主题的引用,它可以访问、控制或扩展RealSubject的功能
-
Client:客户端,通过使用代理类来访问真实的主题类
按照上面的类图,可以实现如下代码:
//主题类接口
public interface Subject {
void Request();
}
//真实的主题类
public class RealSubject implements Subject{
@Override
public void Request() {
System.out.println("我是真实的主题类");
}
}
//代理类
public class Proxy implements Subject{
private RealSubject realSubject;
@Override
public void Request() {
if (realSubject == null) {
realSubject = new RealSubject();
}
realSubject.Request();
}
}
//客户端
public class Client {
public static void main(String[] args) {
Proxy proxy = new Proxy();
proxy.Request();
}
}
代理模式有比较广泛的使用,比如Spring AOP、RPC、缓存等。在 Java 中,根据代理的创建时期,可以将代理模式分为静态代理和动态代理,下面就来分别阐述。
二、代理模式实现
动态代理和静态代理的区分就是语言类型是在运行时检查还是在编译期检查。
2.1 静态代理
静态代理是指在编译期,也就是在JVM运行之前就已经获取到了代理类的字节码信息。即Java源码生成.class文件时期: