百度百科
代理模式的定義:為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)禽捆。在某些情況下装畅,一個(gè)對(duì)象不適合或者不能直接引用另一個(gè)對(duì)象叹谁,而代理對(duì)象可以在客戶(hù)端和目標(biāo)對(duì)象之間起到中介的作用竭恬。
代理模式的作用:
1第步、功能增強(qiáng):在原有功能上增加額外的功能
2均驶、控制訪問(wèn):代理類(lèi)不讓訪問(wèn)目標(biāo)類(lèi)
實(shí)現(xiàn)代理的方式
靜態(tài)代理:
1.自己手工實(shí)現(xiàn)曹质,自己創(chuàng)建一個(gè)java類(lèi)有梆,表示代理類(lèi)赁炎。
2.同時(shí)所要代理的目標(biāo)類(lèi)是確定的醉箕。
代理類(lèi)完成的功能:
1.目標(biāo)類(lèi)中方法的調(diào)用
2.功能的增強(qiáng)
優(yōu)缺點(diǎn):
優(yōu)點(diǎn):實(shí)現(xiàn)簡(jiǎn)單钾腺,容易理解
缺點(diǎn):當(dāng)項(xiàng)目中,目標(biāo)類(lèi)和代理類(lèi)很多的時(shí)候
1)當(dāng)目標(biāo)類(lèi)增加讥裤,代理類(lèi)可能需要成倍增加
2)當(dāng)接口中功能怎加或修改放棒,會(huì)影響眾多實(shí)現(xiàn)類(lèi),廠家類(lèi)己英,代理類(lèi)都需要修改
代碼實(shí)現(xiàn):
實(shí)現(xiàn)步驟:
1.創(chuàng)建一個(gè)接口间螟,定義賣(mài)U盤(pán)的方法,表示廠家和商家做的事情
2.創(chuàng)建廠家類(lèi)损肛,實(shí)現(xiàn)1的接口
3.創(chuàng)建商家厢破,就是代理,也需要實(shí)現(xiàn)1中的接口
4.創(chuàng)建客戶(hù)端類(lèi)治拿,調(diào)用商家的方法買(mǎi)一個(gè)優(yōu)盤(pán)
創(chuàng)建一個(gè)接口
//表示功能摩泪,廠家,商家都要完成
public interface UsbSell {
/**
*
* @param amount 一次購(gòu)買(mǎi)的數(shù)量
* @return 返回值表示一個(gè)優(yōu)盤(pán)的價(jià)格
*/
float sell(int amount);
}
創(chuàng)建目標(biāo)類(lèi)
/**
* @author :star
* @description:TODO 目標(biāo)類(lèi):u盤(pán)廠家,廠家不接受用戶(hù)單獨(dú)購(gòu)買(mǎi)
* @date :2020/8/6 20:22
*/
public class UsbKingFactory implements UsbSell {
@Override
public float sell(int amount) {
//一個(gè)優(yōu)盤(pán)價(jià)格85元
return 85.0f;
}
}
創(chuàng)建代理類(lèi)
/**
* @author :star
* @description:TODO 淘寶商家劫谅,代理U盤(pán)廠家銷(xiāo)售
* @date :2020/8/6 20:26
*/
public class TaoBao implements UsbSell {
//聲明商家代理的廠家具體是誰(shuí)
private UsbKingFactory factory = new UsbKingFactory();
@Override
//實(shí)現(xiàn)銷(xiāo)售u盤(pán)的功能
public float sell(int amount) {
//向廠家發(fā)送訂單加勤,告訴廠家,我買(mǎi)了u盤(pán)同波,廠家發(fā)貨
float price = factory.sell(amount);//廠家的價(jià)格
//商家需要加價(jià)鳄梅,代理增加價(jià)格
price = price + 25;//增強(qiáng)功能
//在目標(biāo)類(lèi)的方法調(diào)用后,你做的其他功能未檩,都是增強(qiáng)的意思
System.out.println("淘寶商家給你返了一優(yōu)惠卷");
return price;
}
}
寫(xiě)一個(gè)主方法測(cè)試
public class ShopMain {
public static void main(String[] args) {
//創(chuàng)建代理商家taobaod對(duì)象
TaoBao taoBao = new TaoBao();
float price = taoBao.sell(1);
System.out.println("通過(guò)淘寶商家戴尸,購(gòu)買(mǎi)u盤(pán)單價(jià)" + price) ;
}
}
運(yùn)行結(jié)果
動(dòng)態(tài)代理:
當(dāng)項(xiàng)目中,目標(biāo)類(lèi)和代理類(lèi)很多的時(shí)冤狡,可以避免靜態(tài)代理的缺點(diǎn)孙蒙。動(dòng)態(tài)代理中目標(biāo)類(lèi)即使很多
1)代理類(lèi)數(shù)量可以很少
2)當(dāng)修改接口中的方法時(shí),不會(huì)影響代理類(lèi)
概念
動(dòng)態(tài)代理:在程序執(zhí)行過(guò)程中悲雳,使用jdk的反射機(jī)制挎峦,創(chuàng)建代理類(lèi)對(duì)象,并動(dòng)態(tài)的指定代理目類(lèi)合瓢。換句話(huà)說(shuō)坦胶,動(dòng)態(tài)代理就是一種創(chuàng)建java對(duì)象的能力
動(dòng)態(tài)代理的實(shí)現(xiàn):
1.jdk動(dòng)態(tài)代理:使用java 反射包中的類(lèi)和接口實(shí)現(xiàn)動(dòng)態(tài)代理功能
反射包java.lang.reflect,里面有三個(gè)類(lèi):InvocationHandler,Method,Proxy
2.cglib動(dòng)態(tài)代理:cglib是第三方工具庫(kù),創(chuàng)建代理對(duì)象晴楔。cglib的原理是繼承顿苇,通過(guò)繼承目類(lèi),創(chuàng)建它的子類(lèi)税弃,在子類(lèi)中重寫(xiě)父類(lèi)中的同名方法纪岁,實(shí)現(xiàn)功能的修改
因?yàn)閏glib是繼承,重寫(xiě)方法则果,所以要求目標(biāo)類(lèi)不能是final的幔翰,方法也不能是final的漩氨,比如mybatis,spring框架中都有使用