设计模式之代理模式
代理模式(Proxy),其含义是为其他对象提供一种代理以控制对这个对象的访问。对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化。当客户向Proxy对象第一次提出请求时,proxy实例化真实的对象,并且将请求传给它,以后所有的客户请求都经由proxy传给封装了的真实对象。
其适用性:
远程代理(Remote Proxy)为一个对象在不同的地址空间提供局部代表,
虚代理(Virtual Proxy)根据需要创建开销很大的对象,
保护代理(Protection Proxy)控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候,
智能代理(Smart Reference)取代了简单的指针,它在访问对象时执行一些附加操作,它的典型用途包括:对指向实际对象的引用计数,这样当该对象没有引用时,可以自动释放它,当第一次引用一个持久对象时,将它装入内存,在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它。
下面是结构图:
由上面可以看出,其实proxy模式的结构图和装饰模式的结构很像,若要让Decorator直接维护一个指向ConcreteComponent的指针,其就实现了proxy模式。
很多情况如果因为不想让或不能让客户代码可以直接调用业务实体的时候,需要使用代理模式,这个就相当于我们在这之间加了一个中间层,间接的访问业务类。
下面是代理模式的简单实现:
Subject.java
public abstract class Subject {
public abstract void request();
}
ConcreteSubject.java
public class ConcreteSubject extends Subject{
@Override
public void request() {
System.out.println("ConcreteSubject request!");
}
}
Proxy.java
public class Proxy {
private Subject subject;
public Proxy(Subject subject){
this.subject = subject;
}
public void request(){
System.out.println("Proxy request:");
subject.request();
}
}
上面仅仅是简单的实现,代理模式的使用有很多种,代理模式在分布式环境中常被使用到,在此注意的是远程代理只是地址空间的远程,可以是不同的进程之间。代理模式和装饰模式,适配器模式很相似,但只要记住代理模式是一个中间层的替身概念,就好理解了。