代理
代理是英文 Proxy 翻譯過(guò)來(lái)的。我們?cè)谏钪幸?jiàn)到過(guò)的代理,例如大部分微商 , 大概最常見(jiàn)的就是朋友圈中賣面膜的同學(xué)了。
她們從廠家拿貨,然后在朋友圈中宣傳,然后賣給熟人。
按理說(shuō),顧客可以直接從廠家購(gòu)買產(chǎn)品,但是現(xiàn)實(shí)生活中,很少有這樣的銷售模式。一般都是廠家委托給代理商進(jìn)行銷售,顧客跟代理商打交道,而不直接與產(chǎn)品實(shí)際生產(chǎn)者進(jìn)行關(guān)聯(lián)。
所以,代理就有一種中間人(中介)的味道。
接下來(lái),我們說(shuō)說(shuō)軟件中的代理模式。
靜態(tài)代理
我們通過(guò)一條例子 來(lái)感受下 什么是靜態(tài)代理 .
真實(shí)角色和代理角色 共同實(shí)現(xiàn) 接口 !
例如 :
真實(shí)角色 : You
代理角色 : 婚慶公司
實(shí)現(xiàn)相同的接口 : 結(jié)婚禮儀 .
public class StaticProxy {
/**
* 靜態(tài)代理
* 接口
* 1.真實(shí)角色
* 2.代理角色
*/
public static void main(String[] args) {
new WeddingCompany(new You()).happyMarry();
}
}
//接口
interface Marry {
void happyMarry();
}
//真實(shí)角色
class You implements Marry {
@Override
public void happyMarry() {
System.out.println("我和嫦娥奔月了!");
}
}
//代理角色
class WeddingCompany implements Marry {
//真實(shí)角色 目標(biāo)對(duì)象
private Marry target;
public WeddingCompany(Marry target) {
this.target = target;
}
@Override
public void happyMarry() {
ready();
this.target.happyMarry();
after();
}
private void after() {
System.out.println("結(jié)束");
}
private void ready() {
System.out.println("忙前忙后");
}
}
值得注意的是,代理類和被代理類應(yīng)該共同實(shí)現(xiàn)一個(gè)接口,或者是共同繼承某個(gè)類。
上面介紹的是靜態(tài)代理的內(nèi)容,為什么叫做靜態(tài)呢?因?yàn)樗念愋褪鞘孪阮A(yù)定好的,
****知道為什么要使用靜態(tài)代理**
解決代碼責(zé)任不分離的問(wèn)題,但同樣其也會(huì)帶來(lái),隨著項(xiàng)目變大,業(yè)務(wù)類多的話,導(dǎo)致代理類太多**
動(dòng)態(tài)代理
****知道為什么要使用動(dòng)態(tài)代理**
不僅可以解決碼責(zé)任不分離的問(wèn)題,彌補(bǔ)靜態(tài)代理的缺點(diǎn)
但同樣有問(wèn)題,API 不易使用,若用 Spring 的情況,配置過(guò)多**
使用 JDK 動(dòng)態(tài)代理 代理類與真實(shí)類共同實(shí)現(xiàn)相同接口
使用 CGLIB 動(dòng)態(tài)代理 代理類是繼承真實(shí)類
總結(jié)
- 代理分為靜態(tài)代理和動(dòng)態(tài)代理兩種。
- 靜態(tài)代理,代理類需要自己編寫(xiě)代碼寫(xiě)成。
- 動(dòng)態(tài)代理,代理類通過(guò) Proxy.newInstance() 方法生成。
- 不管是靜態(tài)代理還是動(dòng)態(tài)代理,代理與被代理者都要實(shí)現(xiàn)兩樣接口,它們的實(shí)質(zhì)是面向接口編程。
- 靜態(tài)代理和動(dòng)態(tài)代理的區(qū)別是在于要不要開(kāi)發(fā)者自己定義 Proxy 類。
- 動(dòng)態(tài)代理通過(guò) Proxy 動(dòng)態(tài)生成 proxy class,但是它也指定了一個(gè) InvocationHandler 的實(shí)現(xiàn)類。
- 代理模式本質(zhì)上的目的是為了增強(qiáng)現(xiàn)有代碼的功能。