代理模式
什么是代理模式?
为其他对象提供一种代理以控制对对象的访问。又叫委托模式。
代理模式把代理对象插入到访问者和目标对象之间,从而为访问者对目标对象的访问引入一定的间接性。正是这种间接性,给了代理对象很多操作空间,比如在调用目标对象前和调用后进行一些预操作和后操作,从而实现新的功能或者扩展目标的功能。
生活中的例子:翻译,中介,律师等扮演的都是代理的角色。
动机
在某些情况下,客户不想或不能直接引用某个对象,这个时候就需要一个中介(中间人)帮忙完成间接引用,该中介被称为 ”代理对象“。
结构
场景
- 拦截器
- AOP:动态代理,CGLIB以及JDK
- 缓存代理,备忘模式就是使用缓存代理的思想,将复杂计算的结果缓存起来,下次传参一致时直接返回之前缓存的计算结果
- 保护代理:比如对某一对象进行访问时,可以设置保护代理,对请求进行过滤,起到保护作用。
优缺点
优点
- 代理对象在访问者与目标对象之间可以起到中介和保护目标对象的作用;
- 代理对象可以扩展目标对象的功能;
- 代理模式能将访问者与目标对象分离,在一定程度上降低了系统的耦合度,如果我们希望适度扩展目标对象的一些功能,通过修改代理对象就可以了,符合开闭原则;
缺点
增加了一层实际上增加了系统的复杂度,因此要考虑系统是否真正需要代理。
实现
// 主要实现一些公共的方法
package com.wlj.proxy;
/**
* @author wlj
* @Classname IService
* @Description 处理业务逻辑
* @Date 7/2/2022 3:33 PM
*/
public interface IService {
void send();
}
// 真实对象
package com.wlj.proxy;
/**
* @author wlj
* @Classname Target
* @Description 真实对象
* @Date 7/2/2022 3:39 PM
*/
public class Target implements IService{
public Target() {
}
@Override
public void send() {
System.out.println("目标对象发送了消息");
}
}
// 代理对象
package com.wlj.proxy;
/**
* @author wlj
* @Classname Proxy
* @Description 代理对象
* @Date 7/2/2022 3:40 PM
*/
public class Proxy implements IService{
// 实际对象
private Target target;
public Proxy(Target target) {
this.target = target;
}
@Override
public void send() {
System.out.println("代理调用目标对象方法前");
this.target.send();
System.out.println("代理调用目标对象方法后");
}
}
// 客户端
package com.wlj.proxy;
/**
* @author wlj
* @Classname Client
* @Description 客户端
* @Date 7/2/2022 3:44 PM
*/
public class Client {
public static void main(String[] args) {
Target target = new Target();
Proxy proxy = new Proxy(target);
proxy.send();
}
}
// 结果
代理调用目标对象方法前
目标对象发送了消息
代理调用目标对象方法后
总结:代理对象可以基于目标对象进行一些新的扩展而无需改动真实对象的代码。比如中介租房子给客人,中介收的中介费就是如此,实际上房子还是房东租给你的,但是中介负责将你们联系起来了。
面试题:适配器模式,代理模式,装饰者模式的不同?
1、装饰者模式的关注点在于添加功能。
2、代理模式的关注点在于控制对象的访问,其原型对象对于用户无法得知。
3、适配器模式关注点在于适配。