代理模式是一种结构型设计模式,它允许通过使用代理对象来控制对另一个对象的访问。
代理对象通常会拦截对被代理对象的访问,并在其间插入额外的逻辑功能或控制。
举例: 假设你有一个喜欢的女孩,你想要告诉她你对他的爱,但是呢?你是个怂货,不敢直接说,所以你就想通过女孩的闺蜜转达。
在这个过程中就是代理模式的应用 代理模式由以下组成:
-
抽象角色(Subject):定义一个接口,该接口是代理对象和被代理对象的共同接口,以便代理对象能够替代被代理对象实现客户端的请求。
在上面的案例中,抽象角色就是:你的爱,想说出来
-
真实角色(Real Subject):实现抽象角色定义的接口,并承担实际处理客户端请求的任务。
在上面的案例中:真实角色就是:你【想表白的人(怂货)】
-
代理角色(Proxy):实现抽象角色定义的接口,并保存一个真实角色的引用。代理对象接受客户端的请求,然后转发请求给真实角色。
在上面的案例中:代理角色就是,女孩的闺蜜
代码实现:
1、抽象角色【我对女孩的爱】
public interface MyLove {
void say();
}
2、真实角色【表白的人】
/**
* 真实对象
**/
public class MySelf implements MyLove{
private String context;
public MySelf() {
}
public MySelf(String context) {
this.context = context;
}
@Override
public void say() {
System.out.println("我想说:" + this.context);
}
public String getContext() {
return context;
}
public void setContext(String context) {
this.context = context;
}
}
3、创建代理角色
/**
* 女孩的闺蜜,作为代理角色
* 想要让闺蜜表达对女孩的爱,就需要让闺蜜去表达,就是要实现 MyLove 向女孩说出来
* 想要让女孩说出我想说的话,就需要将我自己聚合到闺蜜中,闺蜜才知道我想表达什么
**/
public class GrilFriend implements MyLove {
private final MySelf my;
public GrilFriend(MySelf my) {
this.my = my;
}
/**
* 闺蜜想女孩表达男孩说的话
**/
@Override
public void say() {
System.out.println("闺蜜说:亲爱的,有个怂货喜欢你,但是他不敢告诉你,让我来告诉你。");
System.out.println("闺蜜说:那个人想说");
//闺蜜转达男孩的话
this.my.say();
System.out.println("闺蜜说:你觉得怎么样");
}
}
4、现在就可以测试了
public static void main(String[] args) {
//声明真实角色,想表白的人
MySelf my = new MySelf();
//想表白的人想说什么
my.setContext("亲爱的girl,从我第一眼看见你,我就...,就...,我怂了。。。");
//创建代理对象
GrilFriend grilFriend = new GrilFriend(my);
//代理对象帮忙转达
grilFriend.say();
}
//测试结果
闺蜜说:亲爱的,有个怂货喜欢你,但是他不敢告诉你,让我来告诉你。
闺蜜说:那个人想说
我想说:亲爱的girl,从我第一眼看见你,我就...,就...,我怂了。。。
闺蜜说:你觉得怎么样
从上面的案例可以看出,代模式的特征是:
-
真实角色和代理角色都需要实现抽象角色,才能都实现真正的目的。
-
真实角色需要聚合到代理角色中,这样代理角色才能够转达真实角色想要表达什么。
代理模式的主要作用在于控制对其它对象的访问和使用,从而改变原来类与类之间的关系,可以用于实现程序的解耦和保护目标对象的安全性。常见的应用场景包括:远程调用、缓存处理、安全授权、延迟加载等。