代理模式
定義:爲某個對象提供一個代理,以控制對這個對象的訪問。代理類和委託類有共同的父類或父接口,這樣在任何使用委託類對象的地方都可以用代理對象替代。代理類負責請求的預處理、過濾、將請求分派給委託類處理、以及委託類執行完請求後的後續處理。
代理模式UML類圖:
解釋說明:代理類Proxy,和實際主題RealSubject都實現了抽象主題Subject的接口,且Proxy中包含RealSubject的引用,這樣代理的實例就可以控制對它所包含的RealSubject角色實例的訪問,即可以控制它所代理的對象的訪問,從而達到代理目的。
靜態代理模式案例
說明:靜態代理是由程序員創建或者工具生成代理類的源碼,再編譯代理類所謂靜態也就是在程序運行前就已經存在代理類的字節碼文件,代理類和委託類的關係在運行前就確定了。
代碼:
packageorg.sdibt.freebird.pattern;
/**
* 被代理者
* @author 15684
*/
publicclass RealStudent implements ISign{
@Override
publicvoid sign() {
// TODO Auto-generated method stub
System.out.println("--------本人跟學校簽訂就業協議--------");
}
}
packageorg.sdibt.freebird.pattern;
/**
* 代理者
* @author 15684
*/
publicclass ProxyStudent implements ISign{
privateRealStudent real;
publicRealStudent getReal() {
returnreal;
}
publicvoid setReal(RealStudent real) {
this.real = real;
}
@Override
publicvoid sign() {
// TODO Auto-generated method stub
System.out.println("-------代理前請出示身份證--------");
this.getReal().sign();
}
}
packageorg.sdibt.freebird.pattern;
/**
* 接口
* @author 15684
*/
publicinterface ISign {
voidsign();
}
packageorg.sdibt.freebird.pattern;
/**
* 測試代理類
* @author 15684
*/
publicclass TestProxy {
publicstaticvoid main(String[] args) {
RealStudent real = new RealStudent();
ProxyStudent proxy = new ProxyStudent();
proxy.setReal(real);
proxy.sign();
}
}
動態代理模式案例
/**
* 接口
* @author15684
*/
publicinterface ISign {
void sign();
}
/**
* 定義切面
* @author15684
*/
publicclass MyAspectHandler implements InvocationHandler{
private Object target;
public Object getTarget() {
returntarget;
}
publicvoid setTarget(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// 定義切面
System.out.println("----代理前請出示身份證。。。。。");
Object invoke = method.invoke(target);
System.out.println("------代理完成後電話告知------");
returninvoke;
}
}
/**
* 被代理者
* @author15684
*/
publicclass RealStudent implements ISign{
@Override
publicvoid sign() {
// TODO Auto-generated method stub
System.out.println("--------本人跟學校簽訂就業協議--------");
}
}
/**
* 測試動態代理
* @author15684
*/
publicclass TestDynamicProxy {
publicstaticvoid main(String[] args) {
MyAspectHandler myAspectHander = new MyAspectHandler();
myAspectHander.setTarget(new RealStudent());
ISign proxy = (ISign) Proxy.newProxyInstance(RealStudent.class.getClassLoader(), new Class[] {ISign.class}, myAspectHander);
proxy.sign();
}
}