之前看技术书,每每看到“代理”这两字就懵。今天刚好有机会好好了解所谓的代理(Proxy)。
为了更好了解代理关系,我们先来看看其他两种关系:组合与继承
1、组合
只需将对象引用置于新类中即可。例如,假设你需要某个对象,它要具有多个String对象,几个基本类型数据,以及另一个类的对象。
class WaterSource { private String s; WaterSource() { System.out.println("WaterSource"); s = "Constructed"; } public String toString() { return s; } } public class SprinklerSystem { private String value1, value2, value3, value4; private WaterSource source = new WaterSource(); private int i; private floate f; public String toString() {....} ....... }
2、继承就不用多说了
3、代理
代理是继承与组合之间的中庸之道,因为我们可以将一个成员置于索要构造的类中(类似于组合),但与此同时,我们在新类中暴露了该成员对象的所有方法(就像继承)。例如:
太空船需要一个控制模块:
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() {} }
构造太空船的一种方式是使用继承:
public 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(10); } }
然而,SpaceShip并非真正的SpaceShipControls类型,即使你可以告诉SpaceShip向前运动。更准确地说,SpaceShip包含SpaceShipControls,与此同时,SpaceShipControls的所有方法在SpaceShip中暴露出来,代理正好解决这个问题:
public class SpaceShipDelegation { private String name; private SpaceShipControls controls = new SpaceShipControls(); public SpaceShipDelegation(String name) { this.name = name; } public void back(int velocity) { controls.back(velocity); } public void forward(int velocity) { controls.forward(velocity); } ...... }