這幾天在看動(dòng)態(tài)代理的知識(shí)殿雪,聯(lián)想到代理設(shè)計(jì)模式邮破。這里簡(jiǎn)單分析一下邻吞,如果有遺漏的地方還望大家指正。
什么是代理模式
為其他對(duì)象提供一種代理以控制這個(gè)對(duì)象的訪問(wèn)橱脸。
代理模式有什么好處
某些情況下础米,一個(gè)客戶不想或者不能直接引用另一個(gè)對(duì)象,而代理對(duì)象可以在客戶端和目標(biāo)對(duì)象之間起到中介作用添诉。
為了保證客戶端使用的透明性屁桑,委托對(duì)象和代理對(duì)象都需要實(shí)現(xiàn)同一個(gè)接口。
一般涉及到的角色
抽象角色:聲明真實(shí)對(duì)象和代理對(duì)象的共同接口栏赴;
代理角色:代理對(duì)象角色內(nèi)部含有對(duì)真實(shí)對(duì)象的引用蘑斧,從而可以操作真實(shí)對(duì)象,同時(shí)代理對(duì)象提供與真實(shí)對(duì)象相同的接口以便在任何時(shí)刻都能代替真實(shí)對(duì)象须眷。同時(shí)竖瘾,代理對(duì)象可以在執(zhí)行真實(shí)對(duì)象操作時(shí),附加其他的操作花颗,相當(dāng)于對(duì)真實(shí)對(duì)象進(jìn)行封裝捕传。
真實(shí)角色:代理角色所代表的真實(shí)對(duì)象,也是我們最終要引用的對(duì)象扩劝。
靜態(tài)代理實(shí)例
public interface Woman {
void winking();
void ml();
}
//真實(shí)角色
public class PanJinLian implements Woman{
@Override
public void winking() {
System.out.println("PanJinLian winking!");
}
@Override
public void ml() {
System.out.println("PanJinLian ml!!!");
}
}
//代理角色
public class WangPo implements Woman {
private PanJinLian pjl;
public WangPo(PanJinLian pjl) {
this.pjl = pjl;
}
@Override
public void winking() {
//實(shí)際指向的是PJL
this.pjl.winking();
}
@Override
public void ml() {
this.pjl.ml();
}
}
//相當(dāng)于Client
public class XiMenQing {
public static void main(String [] args){
WangPo wangPo = new WangPo(new PanJinLian());
wangPo.winking();
wangPo.ml();
}
}
這里可能會(huì)覺(jué)得為什么不讓西門慶直接跟潘金蓮庸论。我再舉個(gè)例子吧。讀書的時(shí)候給喜歡的女孩子傳字條棒呛,老師正在臺(tái)上講的熱火朝天聂示。我(實(shí)際類)只能讓其它同學(xué)(相當(dāng)于代理類)幫忙把你的字條(相當(dāng)于例子中的接口)傳給你喜歡的女孩子啦。
動(dòng)態(tài)代理類
編譯期間不知道確切對(duì)象簇秒,運(yùn)行期間確定對(duì)象鱼喉。(傳入的是真實(shí)對(duì)象)
public class DynamicProxy implements InvocationHandler {
private Object obj;
public DynamicProxy(Object obj) {
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object invoke = method.invoke(obj, args);
return invoke;
}
}
PanJinLian panJinLian = new PanJinLian();
//構(gòu)造一個(gè)動(dòng)態(tài)代理
DynamicProxy proxy = new DynamicProxy(panJinLian);
//獲取被代理類
ClassLoader classLoader = panJinLian.getClass().getClassLoader();
Woman woman = (Woman) Proxy.newProxyInstance(classLoader, new Class[]{Woman.class}, proxy);
woman.winking();
woman.ml();