一、什么是代理模式:
## 代理模式就是为其他对象提供一种代理来控制对这个对象的访问的适用场合的模式 ##
二、代理模式的模型:
/**
* 真实请求类和代理类的公共接口
*/
public interface Subject {
public void request();
}
/**
* 真实请求类,实现真实请求类与代理类的公共接口
*/
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("真实的请求");
}
}
/**
* 代理类,拥有一个真实请求类的实例
*/
public class Proxy implements Subject {
RealSubject realSubject; // 真实请求类的对象
@Override
public void request() {
if (realSubject == null)
realSubject = new RealSubject();
realSubject.request(); // 调用真实类的的真实请求方法以达到代理的效果
}
}
/**
* 客户端类,用于测试
*/
public class Client {
public static void main(String[] args) {
Proxy proxy = new Proxy();
proxy.request();
}
}
三、 一个关于代理模式的例子(参考大话设计模式)
(1)问题背景:
该实例是代理模式的一个简单例子:
模拟的是一个男生要追一个女生,然后男生不直接给女生送花(暂叫男1和女1),而是通过另外叫一个男生(男2)帮他送花的模式
在这里,男1相当于真实真实请求类,男2相当与代理类
(2)代码:
/**
* 女生类, 追求者所追求的女生类
*/
public class Girl {
private String name;// 被追求者名字
public Girl(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/**
* 真实请求类和代理类的公共接口,定义了几个行为
*/
public interface Subject {
/**
* 送花
*/
public void sendFlowers();
/**
* 送巧克力
*/
public void sendChocolate();
/**
* 送玩具
*/
public void sendDolls();
}
/**
* 追求者类, 相当于真实请求类,实现公共接口
*/
public class Pursuit implements Subject {
Girl girl; // 追求者所追求的女生对象
public Pursuit(Girl girl) {
this.girl = girl;
}
@Override
public void sendFlowers() {
System.out.println(girl.getName() + ",送花给你");
}
@Override
public void sendChocolate() {
System.out.println(girl.getName() + ",送巧克力给你");
}
@Override
public void sendDolls() {
System.out.println(girl.getName() + ", 送玩具给你");
}
}
/**
* 代理类,拥有一个追求者实例,同时实现公共借口
*/
public class Proxy implements Subject {
private Pursuit pursuit;
public Proxy(Pursuit pursuit) {
this.pursuit = pursuit;
}
@Override
public void sendFlowers() {
pursuit.sendFlowers();
}
@Override
public void sendChocolate() {
pursuit.sendChocolate();
}
@Override
public void sendDolls() {
pursuit.sendDolls();
}
}
/**
* 客户端类,用于测试
*/
public class Client {
public static void main(String[] args) {
Girl girl = new Girl("被追求的女生");
Pursuit pursuit = new Pursuit(girl);
Proxy proxy = new Proxy(pursuit);
proxy.sendChocolate();
proxy.sendDolls();
proxy.sendFlowers();
}
}
四、代理模式使用场合(出自DP):
##(1) 远程代理:为一个对象在不同的地址空间提供局部的代表##
##(2) 虚拟代理:根据需要创建按开销很大的对象。通过代理来存放实例化需要很长时间的真实对象(可以用于优化下载)##
##(3) 安全代理:用来控制真实对象访问的权限##
##(4) 智能指引:当调用真实的对象时,代理处理例外的一些事情##