目的:
为另一个对象提供代理或占位符以控制对其的访问。
使用代理模式,一个类代表另一个类的功能。
程序示例:
想象有一个塔,当地的巫师去那里学习他们的法术。象牙塔只能够通过代理来进入以此来保证只有首先3个巫师才能进入。这里的代理就代表的塔的功能并添加访问控制。
1.巫师类和巫师塔接口与实现
//巫师
public class Wizard{
private final String name;
public Wizard(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
//巫师塔
public interface WizardTower{
void enter(Wizard wizard);
}
//实现
@Slf4j
public class IvoryTower implements WizardTower{
@Override
public void enter(Wizard wizard) {
log.info("{} enters the tower.", wizard);
}
}
2.巫师塔代理
@Slf4j
public class WizardTowerProxy implements WizardTower{
private static final int NUM_WIZARD_ALLOWED = 3;
private int numWizards;
private final WizardTower tower;
public WizardTowerProxy(WizardTower tower) {
this.tower = tower;
}
@Override
public void enter(Wizard wizard) {
if (numWizards < NUM_WIZARD_ALLOWED) {
tower.enter(wizard);
numWizards++;
} else {
log.info("{} is not allowed to enter!", wizard);
}
}
}
3.测试
WizardTowerProxy towerProxy = new WizardTowerProxy(new IvoryTower());
towerProxy.enter(new Wizard("red"));
towerProxy.enter(new Wizard("yellow"));
towerProxy.enter(new Wizard("green"));
towerProxy.enter(new Wizard("blue"));
towerProxy.enter(new Wizard("black"));
/*
red enters the tower.
yellow enters the tower.
green enters the tower.
blue is not allowed to enter!
black is not allowed to enter!
*/
类图: