public class SpaceShipDelegation {
private String name;
private SpaceShipControls controls =
new SpaceShipControls();
public SpaceShipDelegation(String name) {
this.name = name;
}
// Delegated methods:
public void back(int velocity) {
controls.back(velocity);
}
public void down(int velocity) {
controls.down(velocity);
}
public void forward(int velocity) {
controls.forward(velocity);
}
public void left(int velocity) {
controls.left(velocity);
}
public void right(int velocity) {
controls.right(velocity);
}
public void turboBoost() {
controls.turboBoost();
}
public void up(int velocity) {
controls.up(velocity);
}
public static void main(String[] args) {
SpaceShipDelegation protector =
new SpaceShipDelegation("NSEA Protector");
protector.forward(100);
}
} ///:~
SpaceShip类要控制行动需要SpaceShipControls类,有三种选择:SpaceShip类继承SpaceShipControls类、SpaceShip类中创建SpaceShipControls类的对象(组合)、表面通过SpaceShip类控制,底层实际通过SpaceShipControls类控制(代理)
1.SpaceShip类继承SpaceShipControls类
优点:可以通过控制SpaceShip来直接控制行动
缺点:SpaceShipControls类中的所有方法全部暴露给SpaceShip类
2.SpaceShip类中创建SpaceShipControls类的对象(组合)
优点:SpaceShip类与SpaceShipControls类是has-a关系,符合实际飞船与飞船控制之间的关系
缺点:不能通过控制SpaceShip来直接控制飞船行动,比如向前命令,实际上应该是SpaceShip向前,而不应该是SpaceShipControls向前,但组合做不到这一点
3.表面通过SpaceShip类控制,底层实际通过SpaceShipControls类控制(代理)
优点:①表面通过SpaceShip类控制,底层实际通过SpaceShipControls类控制,符合实际逻辑,向前是Space Ship向前,不是SpaceShipControls向前
②控制力更强,可以选择只将SpaceShipControls类部分方法暴露给SpaceShip类
缺点:Java语言不直接支持代理,需要开发工具的支持,比如:JerBrains Idea IDE