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);
}
}
使用代理时可以拥有更多的控制力,因为我们可以选择只提供在成员对象中的方法的某个子集
有没有发现代理和装饰者模式很像,区别应该是装饰着硬性要求提供所有基方法的访问接口。
作者:guodaxia
来源链接:https://www.cnblogs.com/aigeileshei/p/7237457.html
版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。
2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。