20230419 7. 代理模式
介绍
代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。
- ISubject类,定义了RealSubject和Proxy的共用接口
- RealSubject类,定义Proxy所代表的真实实体
- Proxy类,保存一个引用使得代理可以访问实体
代理模式都用在什么场合
- 远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实
- 虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象
- 安全代理,用来控制真实对象访问时的权限
- 智能指引,是指当调用真实的对象时,代理处理另外一些事
代理模式其实就是在访问对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途。
代码示例
ISubject
public interface IGirlGift {
void giveFlowers();
void giveChocolate();
}
RealSubject
public class SchoolBoy implements IGirlGift {
private SchoolGirl schoolGirl;
public SchoolBoy(SchoolGirl schoolGirl) {
this.schoolGirl = schoolGirl;
}
@Override
public void giveFlowers() {
System.out.println("送花给 " + schoolGirl.getName());
}
@Override
public void giveChocolate() {
System.out.println("送巧克力给 " + schoolGirl.getName());
}
}
Proxy
public class Proxy implements IGirlGift {
private IGirlGift girlGift;
public Proxy(SchoolGirl schoolGirl) {
this.girlGift = new SchoolBoy(schoolGirl);
}
@Override
public void giveFlowers() {
girlGift.giveFlowers();
}
@Override
public void giveChocolate() {
girlGift.giveChocolate();
}
}
其他
@AllArgsConstructor
@Data
public class SchoolGirl {
private String name;
}
客户端
public class Test {
public static void main(String[] args) {
SchoolGirl schoolGirl = new SchoolGirl("小美");
Proxy proxy = new Proxy(schoolGirl);
proxy.giveFlowers();
proxy.giveChocolate();
}
}