总结归纳自《Head First 设计模式》,实例部分是通过自己的理解使用最简单的方法实现的代理模式。
1-代理
远程对象的代理,就是假装自己就是远程对象,完成本地对象请求的功能。内部是将请求交给远程对象去完成,并等待获得返回值。
- 辅助对象:代理客户,作为中间桥梁。
2-定义
代理模式为另一个对象提供一个替身用于控制对这个对象的访问。
使用代理模式创建代表,让代表对象控制某对象的访问,被代理的对象可以是远程对象,创建开销大的对象或者需要安全控制的对象。
3-结构
- Subject接口:该接口允许任何客户都可以像处理RealSubject对象一样去处理Proxy对象。
- Proxy(实现Subject):持有RealSubject对象的引用,需要时将请求转发给RealSubject
- RealSubject(实现Subject):真正对象,该对象的访问会被Proxy对象控制。
4-实例
玩家想玩游戏,但是不想升级,却想让自己等级很高可以吹牛,这个时候玩家就会去找代练帮自己玩,这里代练就是代理模式中的Proxy。实现的代码如下:
1-Play接口:subject接口
public interface Play {
public void play(); //玩
}
2-Proxy代理:代练
public class PlayerProxy implements Play{
Player player;
public PlayerProxy(String name) {
player = new Player(name);
}
@Override
public void play() {
player.play();
}
}
3-RealSubject:玩家
public class Player implements Play{
private String name;
public Player(String name) {
this.name = name;
}
@Override
public void play() {
System.out.println(name + " is playing game!");
}
}
4-测试:开始代练
这里还是用户“feather”开始玩,然而本质却是通过Proxy代理去完成的。
PlayerProxy playerProxy = new PlayerProxy("feather");
playerProxy.play();
结果
feather is playing game!
5-学习链接
书中用RMI方法实现代理,将代理模式复杂化了(用不用RMI效果没区别,实现却很复杂),这里有一个代理模式的笔记链接,讲的还是很清爽的:转载:设计模式之代理模式
6-RMI/虚拟代理/动态代理
RMI是什么?
- java RMI框架 远程方法调用。
- RMI提供了客户辅助对象和服务辅助对象。RMI不需要写任何网络和IO代码,客户Client调用远程方法,就和调用在本地JVM上的一般方法调用一样。
- RMI将客户辅助对象称为
stub
桩,服务辅助对象称为skeleton
骨架。
Java在java.lang.reflect包中提供代理支持。可以动态的创建代理类。这就是动态代理。更多代理模式查阅资料学习吧。
7-代理模式和装饰者模式的区别
代理模式:包装另一个对象,并控制对它的访问。
装饰者模式:包装另一个对象,并添加额外的行为。