引言
无论在系统设计或者代码开发中都有着代理设计模式的身影。比如在路由反向代理服务器、Spring框架中的AOP思维。今天来记录一下另一个简单的设计模式-静态代理设计模式(Proxy Pattern)
静态代理模式
代理属于结构型模式的一种。它提供了一种替身或占位符来控制对被代理对象的访问。通过代理可以添加额外的功能,比如访问控制、日志记录、延迟加载、权限校验等,而不会改变原始对象的接口和功能。按照种类,代理可以分为静态代理和动态代理,首先来介绍下静态代理。
静态代理:代理类在编译期间就已经确定,开发人员需要为每一个目标类手动编写对应的代理类。这种代理类通常和目标类实现相同的接口或继承相同的父类。
代码实例如下:
/**
* @堆代码 duidaima.com
* @date 2024/6/6 17:47
*/
public class StaticProxy {
public static void main(String[] args) {
RealRequest realRequest = new RealRequest();
realRequest.request();
System.out.println();
ProxyRequest proxyRequest = new ProxyRequest(realRequest);
proxyRequest.request();
}
}
// 接口
interface Subject{
void request();
}
// 目标类
class RealRequest implements Subject{
@Override
public void request() {
System.out.println("RealSubject: Handing request.");
}
}
// 代理类
class ProxyRequest implements Subject{
private RealRequest realRequest;
public ProxyRequest(RealRequest realRequest){
this.realRequest = realRequest;
}
@Override
public void request() {
preRequest();
realRequest.request();
postRequest();
}
private void preRequest() {
System.out.println("Proxy: Pre-processing request.");
}
private void postRequest() {
System.out.println("Proxy: Post-processing request.");
}
}
代码解析:
• StaticProxy类:包含主函数main,用于展示静态代理模式的使用。
• Subject接口:定义了真实主题和代理主题共同实现的接口,这里只有一个方法request()。
• RealRequest类:实现了Subject接口,代表真实的请求处理对象,实现了具体的业务逻辑。
• ProxyRequest类:同样实现了Subject接口,作为RealRequest的代理,增加了额外的处理逻辑,即在调用真实对象的request方法前后分别执行预处理preRequest和后处理postRequest。
小结
由于代理类和真实主题类的关系在编译期间就已经确定,如果需要为多个真实主题类创建代理,则需要为每个真实主题类编写对应的代理类,这可能导致代码量增加,优点在于实现简单直观。