基本结构:
1、抽象主题:接口,定义需要进行代理的方法。
2、实际主题:实现1接口,实际主题实例是代理实例所要代理的对象。
3、代理:实现1接口,代理包含实际主题声明的对象,因为代理将委托实际主题执行相关的方法。在委托的前后将进行一定的干预以控制对实际主题的访问。
(实际主题被代理或称,代理根据需要委托实际主题执行逻辑)
1、抽象主题
package proxy;
/**
* @author Jangle jangle@jangle.xyz:
* @date 创建时间:2016年10月5日 上午9:17:30
* @version 1.0
*/
public interface BaseProxy {
public void theMethod();
}
2、实际主题
package proxy;
/**
* @author Jangle jangle@jangle.xyz:
* @date 创建时间:2016年10月5日 上午9:20:38
* @version 1.0
*/
public class Template implements BaseProxy {
@Override
public void theMethod() {
System.out.println("I'm do something!!");
}
}
3、代理
代理1
package proxy;
/**
* @author Jangle jangle@jangle.xyz:
* @date 创建时间:2016年10月5日 上午9:21:52
* @version 1.0
*/
public class Proxy implements BaseProxy {
private BaseProxy baseProxy;
/**
* @param baseProxy
*/
public Proxy(BaseProxy baseProxy) {
super();
this.baseProxy = baseProxy;
}
@Override
public void theMethod() {
System.out.println("intervene before");
baseProxy.theMethod();
System.out.println("intervene after");
}
}
代理2
package proxy;
/**
* @author Jangle jangle@jangle.xyz:
* @date 创建时间:2016年10月5日 上午9:27:01
* @version 1.0
*/
public class Proxy2 implements BaseProxy {
BaseProxy baseProxy;
/**
* @param baseProxy
*/
public Proxy2(BaseProxy baseProxy) {
super();
this.baseProxy = baseProxy;
}
@Override
public void theMethod() {
before();
baseProxy.theMethod();
after();
}
private void before(){
System.out.println("before");
}
private void after(){
System.out.println("after");
}
}
100、程序
<pre name="code" class="java">package proxy;
/**
* @author Jangle jangle@jangle.xyz:
* @date 创建时间:2016年10月5日 上午9:24:42
* @version 1.0
*/
public class M {
public static void main(String[] args) {
BaseProxy template = new Template();
Proxy proxy = new Proxy(template); //proxy代理template
// proxy.theMethod();
Proxy2 proxy2 = new Proxy2(proxy); //proxy2代理proxy,即对template进行了2层代理,或者说2级委托
proxy2.theMethod();
}
}
结果输出:
before
intervene before
I'm do something!!
intervene after
after
I'm do something 是主要要执行的逻辑。 代理后,对其进行了一定的干预,使其这执行之前或者之后可以做一些其他的事情。
这些其他的事情可以是:
1、before事务的开始,after事务的提交。
2、我们也可以把委托的方法放在try catch块中,对方法进行异常抓取与处理,如:
try {
baseProxy.theMethod();
} catch (xxxException x) {
// TODO: handle exception
} catch (yyyException y) {
// TODO: handle exception
} catch (Exception e) {
// TODO: handle exception
}
3、我们也可以进行日志的输出,如
logger.info("xxxxBegin");
baseProxy.theMethod();
logger.info("xxxxEnd");
当然这些在Spring框架中都有所应用,他们更强大,更精致,需要进一步学习。