代理模式
靜態(tài)代理
public interface Subject{
void doSomething();
}
public class RealSubject implements Subject{
@Override
public void doSomething() {
System.out.println( "call doSomething()" );
}
}
public class AnotherRealSubject implements Subject{
@Override
public void doSomething() {
System.out.println("call another doSomething().");
}
}
public class TestProxy {
public static void main(String[] args) {
// static proxy
new SubjectProxy().doSomething();
}
}
// output:
// call doSomething()
動(dòng)態(tài)代理
// 動(dòng)態(tài)代理的核心,將代理類抽象出來,作為獨(dú)立邏輯
public class ProxyHandler implements InvocationHandler{
private Object target;
/**
* 綁定委托對(duì)象,并返回代理類
*/
public Object bind(Object target){
this.target = target;
//綁定該類實(shí)現(xiàn)的所有接口,取得代理類
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
//這里就可以進(jìn)行所謂的AOP編程了
//在調(diào)用具體函數(shù)方法前,執(zhí)行功能處理
result= method.invoke(target, args);
//在調(diào)用具體函數(shù)方法后,執(zhí)行功能處理
return result;
}
}
public class TestProxy {
public static void main(String[] args) {
// dynamical proxy
ProxyHandler proxyHandler = new ProxyHandler();
// Object 1
Subject subject = (Subject) proxyHandler.bind(new RealSubject());
subject.doSomething();
// Object 2
Subject mocked = (Subject) proxyHandler.bind(new AnotherRealSubject());
mocked.doSomething();
}
}
// output:
// call doSomething()
// call doSomething()
// call another doSomething().
由上圖代碼可看到,proxy邏輯被抽象到ProxyHandler中,與業(yè)務(wù)完全解耦,業(yè)務(wù)中只需要?jiǎng)討B(tài)綁定委托對(duì)象,即可對(duì)委托對(duì)象的中的方法增強(qiáng)處理。