代理模式(Proxy DP)为另一个对象提供一个替身或者占位符以控制这个对象的访问(原文:Provide a surrogate or placeholder for another object to control access to it)。
代理模式一般有三种代理:远程代理,虚拟代理和保护代理(Remote Proxy, Virtual Proxy and Protection Proxy)。
远程代理是给不同地址空间的对象以一个本地代表。
虚拟代理用来按需生成昂贵的对象。
保护代理控制访问权限。
代码:
巫师:
/**
*
* Wizard
*
*/
public class Wizard {
private final String name;
public Wizard(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
巫师塔接口:
/**
* WizardTower interface
*/
public interface WizardTower {
void enter(Wizard wizard);
}
象牙塔,巫师塔的一个实现类:
/**
*
* The object to be proxyed.
*
*/
public class IvoryTower implements WizardTower {
private static final Logger LOGGER = LoggerFactory.getLogger(IvoryTower.class);
public void enter(Wizard wizard) {
LOGGER.info("{} enters the tower.", wizard);
}
}
巫师塔代理:
/**
*
* The proxy controlling access to the {@link IvoryTower}.
*
*/
public class WizardTowerProxy implements WizardTower {
private static final Logger LOGGER = LoggerFactory.getLogger(WizardTowerProxy.class);
private static final int NUM_WIZARDS_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_WIZARDS_ALLOWED) {
tower.enter(wizard);
numWizards++;
} else {
LOGGER.info("{} is not allowed to enter!", wizard);
}
}
}
可以看到,巫师塔代理类的作用就是限制巫师的人数,当人数达到限制时就不允许进入。这个属于保护代理。
网友评论