# 定义
代理模式(proxy),为其他对象提供一种代理以控制对象的访问
代理模式结构图
- Subject 类,定义了 RealSubject 和 Proxy的共同接口,这样就在任何使用 RealSubject的地方都可以使用 Proxy
- RealSubject类,定义了 Proxy 所代表的真实实体。
- Proxy 类,保存一个引用使得代理访问实体,并提供一个与 Subject 的接口相同的接口,这样代理就可以来替代实体。
# 应用
- Java
- 数据库连接池中,一般我们在调用数据库的关闭方法的时候,并不是直接关闭了数据库的连接,而是将数据库的连接放入到连接池中,以便下次使用
- Aop 底层,便是使用代理设计模式,动态代理进行实现。实现前置通知,后置通知,环绕通知
- JavaScript
- Axios Http 请求中拦截器,可以提前对
request
,response
进行预处理Request
请求头的设置,与Cookie
信息的设置- 权限信息的预处理,常见的比如验权操作或者
Token
验证 - 数据格式的格式化,比如对组件绑定的
Date
类型的数据在请求前进行一些格式化约定好的序列化操作 - 空字段格式预处理,根据后端进行一些操作
Response
的一些通用报错处理, 比如使用Message
空间抛出错误
- Vue 3.0 数据监听的处理使用
Proxy
- Axios Http 请求中拦截器,可以提前对
# Java 实现代理模式
Subject.java
package com.xx.demo.agent;
/**
* <p>
* TODO:
* </p>
*
* @author hcg
* @date 2020/3/4 23:14
* @className subject
*/
public interface Subject {
void sayHello();
}
RealSubject.java 代理对象,也叫原对象
public class RealSubject implements Subject {
@Override
public void sayHello() {
System.out.println("hello");
}
}
ProxyFactory.java 代理工厂,创建代理类
public class ProxyFactory {
private Object target;
public ProxyFactory(Object target) {
this.target = target;
}
public Object getProxyInstance() {
return Proxy.newProxyInstance(this.target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("我要开始说话了");
Object value = method.invoke(target, args);
System.out.println("我已经说完了");
return value;
}
});
}
public static void main(String[] args) {
Subject subject = new RealSubject();
ProxyFactory proxyFactory = new ProxyFactory(subject);
Subject proxyInstance = (Subject) proxyFactory.getProxyInstance();
proxyInstance.sayHello();
}
}
# JavaScript 中的Proxy
# 代理模式和装饰器模式,适配器模式的区别
与适配器的区别
适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。
与装饰器模式的区别
装饰器模式是为了增强功能,代理模式是为了加以控制。