代理模式
2016-10-22 本文已影响0人
狐尼克朱迪
定义
为另一个对象提供一个替身或占位符以控制对这个对象的访问
使用场景
- 远程代理为不同地址空间中的对象提供本地代表
- 虚拟代理根据需要创建昂贵的对象
- 保护代理控制对原始对象的访问。 当对象应具有不同的访问权限时,保护代理很有用。
典型使用场景
- 控制对另一个对象的访问
- 延迟初始化
- 实现日志记录
- 方便网络连接
- 计数对象的引用
例子
那屋可以进入男巫塔,通过代理可以限制进入塔的人数。
男巫对象:
public class Wizard {
private String name;
public Wizard(String name) {
this.name = name;
}
public String toString() {
return name;
}
}
男巫塔:
public class WizardTower {
public void enter(Wizard wizard) {
System.out.println(wizard + " enters the tower.");
}
}
男巫塔的代理:
public class WizardTowerProxy extends WizardTower {
private static final int NUM_WIZARDS_ALLOWED = 3;
private int numWizards;
@Override
public void enter(Wizard wizard) {
if (numWizards < NUM_WIZARDS_ALLOWED) {
super.enter(wizard);
numWizards++;
} else {
System.out.println(wizard + " is not allowed to enter!");
}
}
}
进入塔:
public class App {
public static void main(String[] args) {
WizardTowerProxy tower = new WizardTowerProxy();
tower.enter(new Wizard("Red wizard"));
tower.enter(new Wizard("White wizard"));
tower.enter(new Wizard("Black wizard"));
tower.enter(new Wizard("Green wizard"));
tower.enter(new Wizard("Brown wizard"));
}
}
分析
代理模式也可以参考图片预加载:第七章 迭代器模式