java的代理(编程思想)

代理
第三种关系被称为代理,java并没有提供对它的直接支持。这是继承和组合之间的中庸之道,因为我们将一个对象置于所要构造的类中(就像组合),但与此同时我们在新类中暴露了该成员对象的所有方法(就像继承)。
public class SpaceShipControls {
void up(int velocity) {}
void down(int velocity) {}
void left(int velocity) {}
void right(int velocity) {}
void forward(int velocity) {}
void back(int velocity) {}
void turboBoost() {}
}

/**
* 使用继承得到太空船
* 然而SpaceShip并非真正的SpaceShipControls类型,即便你可以告诉SpaceShip向前运动(forward())。更准确的讲,
* SpaceShip包含SpaceShipControls,与此同时,SpaceShipControls的所有方法在SpaceShip中暴露出来了
*/
class SpaceShip extends SpaceShipControls {
private String name;
public SpaceShip(String name) { this.name = name;}
public String toString() { return name;}
public static void main(String[] args) {
SpaceShip protector = new SpaceShip("NSEA Protector");
protector.forward(100);
}
}
使用代理
/**
* 代理解决了上面的问题
*/
class SpaceShipDelegation {
private String name;
private SpaceShipControls controls = new SpaceShipControls();
public SpaceShipDelegation(String name) {
this.name = name;
}
//Delegate 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);
}
}
使用代理时可以拥有更多的控制力,因为我们可以选择只提供在成员对象中的方法的某个子集

有没有发现代理和装饰者模式很像,区别应该是装饰着硬性要求提供所有基方法的访问接口。

原文地址:https://www.cnblogs.com/aigeileshei/p/7237457.html