被代理的类:太空船的控制模块
package com.xm.unit07;
/**
* 太空船的控制模块
*/
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() {
}
}
构造太空船的一种方式是使用继承
package com.xm.unit07;
/**
* 继承的方式
*/
public class SpaceShip extends SpaceShipControls {
private String name;
public SpaceShip(String name) {
this.name = name;
}
public String toString() {
return "{name = " + name + "}";
}
public static void main(String[] args) {
SpaceShip protector = new SpaceShip("NSEA protector");
protector.forward(100);
System.out.println(protector);
}
}
然而,SpaceShip并非真正的SpaceShipControls类型,即便你可以使SpaceShip向前运动(rorward())。更准确地江,SpaceShip包含SpaceShipControls,与此同时,SpaceShipControls的所有方法在SpaceShip中都暴露了出来。代理解决的此难题:
package com.xm.unit07;
/**
* 代理的方式
*/
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 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);
}
}
可以看到,上面的方法是如何转递给了地城的controls对象,而且接口由此也就与使用继承得到的接口相同了。但是,我们使用代理时可以拥有更多的控制力,因为我们可以选择只提供在成员对象中的方法的某个子集。
版权声明:本文为weixin_48927623原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。