代理模式:为其他对象提供一个代理以控制对该对象的访问。是一种对象结构型模式。
代理模式的种类:
(1)远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。这样可以隐藏一个对象存在于不同地址空间的事实。
(2)虚拟(Virtual)代理:根据需要创建开销大的对象,使得此对象只有在需要的时候才会被真正创建。
(3)保护(Protect or Access)代理:控制一个对象的权限,如果需要,可以给不同用户提供不同级别的使用权限。
(4)Cache代理:为某一目标的操作结果提供临时的储存空间,以便多个客户端可以共享这些结果。
(5)防火墙(Firewall)代理:保护目标,不让恶意用户接近。
(6)同步化(Synchronization)代理:使几个对象可以同时使用一个对象而没有冲突。
(7)自能化(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作。
(8)Copy-on-Write代理:虚拟代理的一种,把复制托到只有在客户端真正需要时,才真正采取行动。可以大幅度的降低拷贝庞大实体的开销。
代理模式的参与者:抽象主题类(Subject),代理类(Proxy),真正主题类(RealSubject)。
抽象主题类(Subject):定义了Proxy和RealSubject的共同接口。这样使得在任何使用RealSubject的地方可以使用Proxy。
代理类(Proxy):代理类内含有真正主题类(RealSubject)的引用,从而可以在任何时候操作真正主题类(RealSubject)对象。Proxy提供一个与RealSubject相同的接口,这样代理就可以用来替代RealSubject。控制对RealSubject的创建和删除。
真正主题类(RealSubject):定义了Proxy所代表的真正实体。
Subject类:
public abstract class Subject{
public abstract void request();
}
RealSubject类:
public class RealSubject extends Subject(){
public RealSubject (){
//构造函数
}
public void request(){
//实现请求的代码
}
}
Proxy类:
public class Proxy extends Subject(){
private RealSubject realSubject;
public Proxy(RealSubject realSubject){
this.realSubject=realSubject;
//构造函数
}
public void request(){
//实现请求的代码
}
public void preRequest(){
}
//请求前的操作的代码
}
public void postRequest(){
//请求后的操作的代码
}