总结
代理是继承与组合之间的中庸之道,我们使用代理时可以拥有更多的控制力,因此我们可以选择只提供成员对象中的方法的某个子集,而不是像继承和组合那样暴露全部方法。Java并没有对代理提供直接支持,但是在众多的Java框架(如Spring等)中,代理是核心思想之一。
例子
//定义一个宇宙飞船控制器
public class SpaceShipControls{
void up(int velocity){}
void down(int velocity){}
}
//建造宇宙飞船需要一个飞船控制器
//采用继承,暴露了基类所有的方法
public class SpaceShip extends SpaceShipControls{
String name;
SpaceShip(String name){this.name=name;}
public static void main(String[] args){
SpaceShip ship=new SpaceShip("StarShip");
ship.up(100);
}
}
//采用代理,可控地暴露部分方法
public class SpaceShipDelegation{
private String name;
private SpaceShipControls controls=new SpaceShipControls();
SpaceShipDelegation(String name){this.name=name;}
//代理方法
public void up(int velocity){
controls.up(velocity);
}
}