1 Proxy Pattern 代理模式
目的:为其他对象提供一种代理以控制对这个对象的访问;
实现:增加中间层,实现与被代理类组合。
对对象的访问应该被控制时使用;
对访问对象时应该提供附加功能时使用
与装饰器模式的区别是强调对访问的控制,光绪皇帝再着急,有事还是先找慈禧。
2 实现
代码场景:清朝末期,慈禧太后垂帘听政,光绪皇帝被架空,朝政实际上由慈禧操控。
2.1 代码实现
皇帝接口
public interface Emperor {
//处理朝政
public void dealThings(String thing);
}
被代理类:皇帝的实现类光绪皇帝
public class GuangXu implements Emperor {
public GuangXu() {
System.out.println("我是光绪皇帝,我旁边坐着慈禧太后");
}
@Override
public void dealThings(String thing) {
System.out.println("光绪看着关于[" + thing + "]的奏折,无奈的摇了摇头。");
}
}
代理类:慈禧太后
public class CiXi implements Emperor {
private Emperor hd = new GuangXu();
public CiXi() {
System.out.println("慈禧太后垂帘听政");
}
@Override
public void dealThings(String thing) {
look(thing);
decide(thing);
hd.dealThings(thing);
}
private void look(String thing) {
System.out.println("慈禧太后过目了一下关于[" + thing + "]的奏折");
}
private void decide(String thing) {
Random r = new Random();
int i = r.nextInt(10);
//根据心情来进行决策
if (i % 2 == 0) {
System.out.println("然后否决了关于[" + thing + "]的奏折");
} else {
System.out.println("然后同意了关于[" + thing + "]的奏折");
}
}
}
2.2 涉及角色
代理模式包含如下三个角色:
Subject(抽象主题角色):它声明了真实主题和代理主题的共同接口,这样一来在任何使用真实主题的地方都可以使用代理主题,客户端通常需要针对抽象主题角色进行编程。
Proxy(代理主题角色):它包含了对真实主题的引用,从而可以在任何时候操作真实主题对象;在代理主题角色中提供一个与真实主题角色相同的接口,以便在任何时候都可以替代真实主题;代理主题角色还可以控制对真实主题的使用,负责在需要的时候创建和删除真实主题对象,并对真实主题对象的使用加以约束。通常,在代理主题角色中,客户端在调用所引用的真实主题操作之前或之后还需要执行其他操作,而不仅仅是单纯调用真实主题对象中的操作。
RealSubject(真实主题角色):它定义了代理角色所代表的真实对象,在真实主题角色中实现了真实的业务操作,客户端可以通过代理主题角色间接调用真实主题角色中定义的操作。
2.3 调用
调用者:
public class Client {
public static void main(String[] args) {
CiXi cx = new CiXi();
cx.dealThings("给北洋舰队购买装备");
}
}
结果:
我是光绪皇帝,我旁边坐着慈禧太后
慈禧太后垂帘听政
慈禧太后过目了一下关于[给北洋舰队购买装备]的奏折
然后否决了关于[给北洋舰队购买装备]的奏折
光绪看着关于[给北洋舰队购买装备]的奏折,无奈的摇了摇头。
参考文献:
[ 1 ] 图解设计模式/(日)结城浩著;杨文轩译。–北京:人民邮电出版社,2017.1.
[ 2 ] 维基百科 设计模式
[ 3 ] 极客学院WIKI–设计模式.
[ 4 ] 菜鸟教程–设计模式.