代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。
在有些情况下,客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介作用。
代理模式的角色分配:
抽象角色:声明真实对象和代理对象的共同接口
代理角色:代理角色内部含有对真实对象的引用,从而操作真实对象,同时代理对象提供与真实对象相同的接口以便代替真实对象。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
抽象角色:
public abstract class Subject
{
public abstract void request();
}
代理角色:
public class ProxySubject extends Subject
{
private RealSubject realSubject;
public void request()
{
this.preRequest();
if(null == realSubject)
{
realSubject = new RealSubject();
}
realSubject.request();
this.postRequest();
}
private void preRequest()
{
System.out.println("pre request");
}
private void postRequest()
{
System.out.println("post request");
}
}
真实角色:
public class RealSubject extends Subject
{
public void request()
{
System.out.println("From real subject.");
}
}
测试类:
public class Client
{
public static void main(String[] args)
{
Subject subject = new ProxySubject();
subject.request();
}
}
实际客户是对代理进行交涉的,有代理再寻找真实的对象,因此在测试类中建立代理对象。
以上只是静态代理,还可以利用java的反射机制在java.lang.reflect下实现动态代理