所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理(Proxy)模式给某一个对象提供一个代理,并由代理对象控制对原对象的引用。
一,结构
抽象主题角色(Subject):声明了真实主题和代理主题的共同接口,这样一来在任何使用真实主题的地方都可以使用代理主题。
代理主题(Proxy)角色:代理主题角色内部含有对真是主题的引用,从而可以在任何时候操作真实主题对象;代理主题角色提供一个与真实主题角色相同的接口,以便可以在任何时候都可以替代真实主体;控制真实主题的应用,负责在需要的时候创建真实主题对象(和删除真实主题对象);代理角色通常在将客户端调用传递给真实的主题之前或之后,都要执行某个操作,而不是单纯的将调用传递给真实主题对象。
真实主题角色(RealSubject)角色:定义了代理角色所代表的真实对象。
二,示例代码
package com.oa.interceptor;
/**
* 抽象主题角色
* @author Salmon
*
*/
public interface Subject {
public void Request();
}
/**
* 真实主题角色
* @author Salmon
*
*/
public class RealSubject implements Subject {
public void Request() {
System.out.println("Called RealSubject.Request()");
}
}
/**
* 代理主题角色
* @author Salmon
*
*/
public class Proxy implements Subject {
private RealSubject realSubject;
public void Request() {
if(realSubject == null)
realSubject = new RealSubject();
preRequest();
realSubject.Request();
postRequest();
}
private void preRequest() {
System.out.println("PreRequest.");
}
private void postRequest() {
System.out.println("PostRequest.");
}
}
/**
* 客户端调用
* @author Salmon
*
*/
public class Client {
public static void main(String[] args) {
Proxy p = new Proxy();
p.Request();
}
}