更新時(shí)間:2021-08-10 13:48:24 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1494次
動(dòng)態(tài)代理設(shè)計(jì)模式:為所有功能一致的業(yè)務(wù)操作接口提供統(tǒng)一的代理處理操作
代理設(shè)計(jì)模式的核心是有真實(shí)業(yè)務(wù)實(shí)現(xiàn)類(lèi)與代理業(yè)務(wù)實(shí)現(xiàn)類(lèi),代理類(lèi)會(huì)完成比真實(shí)業(yè)務(wù)更多的處理邏輯。
傳統(tǒng)代理設(shè)計(jì)模式的弊端:所有的代理設(shè)計(jì)模式如果按照設(shè)計(jì)要求來(lái)講,必須是基于接口的設(shè)計(jì)。而靜態(tài)代理設(shè)計(jì)的特點(diǎn)在于:一個(gè)代理類(lèi)只為一個(gè)接口服務(wù)。這也是問(wèn)題所在。
java提供的動(dòng)態(tài)代理實(shí)現(xiàn)
//主體接口
interface ISubject{
public void eat(String food,int num);
}
//真實(shí)操作類(lèi)
class Subject implements ISubject{
@Override
public void eat(String food, int num) {
System.out.println("吃了"+num+"份"+food);
}
}
//動(dòng)態(tài)代理類(lèi)[偽代理],想使用動(dòng)態(tài)代理必須實(shí)現(xiàn)此接口
class ProxySubject implements InvocationHandler{
private Object target;
//動(dòng)態(tài)代理綁定真實(shí)業(yè)務(wù)對(duì)象 返回動(dòng)態(tài)代理對(duì)象
public Object bind(Object target){
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
public void eatParpre(){
System.out.println("準(zhǔn)備食物");
}
public void eatClear(){
System.out.println("吃完啦,刷盤(pán)子");
}
//Spring的Aop核心就是使用的動(dòng)態(tài)代理
//method存儲(chǔ)的是真實(shí)業(yè)務(wù)對(duì)象的方法對(duì)象[eat方法對(duì)象]
//args參數(shù) 此處應(yīng)該是我傳遞的 "雞腿", 20 看下圖
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
this.eatParpre();
//使用反射調(diào)用核心業(yè)務(wù)方法
Object ret = method.invoke(target, args);
this.eatClear();
return ret;
}
}
public class ProxyTest {
public static void main(String[] args) {
//調(diào)用
ISubject subject = (ISubject)new ProxySubject().bind(new Subject());
//subject調(diào)用eat的時(shí)候會(huì)觸發(fā)代理對(duì)象調(diào)用invoke方法,在invoke方法里使用反射調(diào)用真實(shí)業(yè)務(wù)方法
subject.eat("雞腿", 20);
}
}
運(yùn)行結(jié)果:
準(zhǔn)備食物
吃了20份雞腿
吃完啦,刷盤(pán)子
例子場(chǎng)景:打架
如:
桃花島比武搶親之戰(zhàn) —— 郭靖與歐陽(yáng)克
華山論劍正邪之戰(zhàn) —— 北丐洪七公和西毒歐陽(yáng)峰
小朋友夢(mèng)想之戰(zhàn) —— 奧特曼與鎧甲勇士
…
這些戰(zhàn)斗之中,都要打架,但是打架之前需要有一些前期準(zhǔn)備,打架(實(shí)戰(zhàn))工作由目標(biāo)對(duì)象實(shí)現(xiàn),而前期的準(zhǔn)備(練功)工作則由代理對(duì)象實(shí)現(xiàn)。
以上就是動(dòng)力節(jié)點(diǎn)小編介紹的"動(dòng)態(tài)代理設(shè)計(jì)模式",希望對(duì)大家有幫助,想了解更多可查看Java設(shè)計(jì)模式。動(dòng)力節(jié)點(diǎn)在線學(xué)習(xí)教程,針對(duì)沒(méi)有任何Java基礎(chǔ)的讀者學(xué)習(xí),讓你從入門(mén)到精通,主要介紹了一些Java基礎(chǔ)的核心知識(shí),讓同學(xué)們更好更方便的學(xué)習(xí)和了解Java編程,感興趣的同學(xué)可以關(guān)注一下。
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)