第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

代理模式

代理模式又稱(chēng)為委托模式。代理模式從字面上很好理解,有些事情你可以不必親自去做,而是通過(guò)更為專(zhuān)業(yè)的人或者機(jī)構(gòu)去做。比如你開(kāi)公司需要工商注冊(cè)。你可以選擇自己去了解相關(guān)的規(guī)章制度,親自跑腿去辦理。也可以通過(guò)專(zhuān)業(yè)機(jī)構(gòu)辦理。這樣你就不需要去了解辦理的細(xì)節(jié),只需把材料交給機(jī)構(gòu)。機(jī)構(gòu)會(huì)為你完成注冊(cè)工作。在這個(gè)過(guò)程中,機(jī)構(gòu)不但會(huì)為你完成機(jī)構(gòu)注冊(cè),而且還有可能為你辦理一些你并不知道的增值服務(wù)。這就是典型的代理模式。

1. 實(shí)現(xiàn)代理模式

我們?cè)倏匆粋€(gè)生活中的例子。房屋買(mǎi)賣(mài)中經(jīng)常會(huì)出現(xiàn)代理的情況。當(dāng)賣(mài)家不在房屋所在地時(shí),可能會(huì)委托自己的親人或者朋友進(jìn)行交易。而買(mǎi)方會(huì)和代理人直接進(jìn)行交易。交易中間的問(wèn)題代理人會(huì)回答,手續(xù)代理人會(huì)辦理。如下圖:
圖片描述
這個(gè)代理人不太老實(shí),私自加了20萬(wàn),想賺差價(jià)。所以不要以為代理人真的只是代理,在這個(gè)過(guò)程中他可以加入自己的邏輯處理。而客戶(hù)和被代理人并不知道。

我們看看采用代理模式如何實(shí)現(xiàn)這個(gè)場(chǎng)景。

首先真正賣(mài)掉房子的還是房主,只不過(guò)和買(mǎi)房人直接進(jìn)行買(mǎi)賣(mài)的是代理人。那么房主和代理人有一個(gè)公共的行為都是賣(mài)房。那么我們可以抽象出一個(gè)接口定義賣(mài)房的行為。房主和代理人都需要實(shí)現(xiàn)這個(gè)接口。真正的賣(mài)房邏輯在房主的實(shí)現(xiàn)中,代理人的賣(mài)房實(shí)現(xiàn)只是調(diào)用房主的實(shí)現(xiàn)而已。要達(dá)到這個(gè)目的,代理人需要持有房主的引用。而買(mǎi)方進(jìn)行買(mǎi)賣(mài)的時(shí)候,僅和代理人打交道。不用知道房主是誰(shuí),也不用讓房主到現(xiàn)場(chǎng)過(guò)戶(hù)。甚至連房主身在何處都不知道。

上面其實(shí)就是這個(gè)例子的程序設(shè)計(jì)。代碼如下:

房屋交易接口代碼:

public interface RealEstate {
    void sell();
}

房主代碼:

public class Seller implements RealEstate {
    @Override
    public void sell() {
        System.out.println("賣(mài)了房子");
    }
}

代理人代碼:

public class SellerProxy implements RealEstate{
    private Seller seller;
    @Override
    public void sell() {
        if(seller==null){
            seller = new Seller();
        }

        seller.sell();

        System.out.println("退稅辦理完畢");
    }
}

類(lèi)圖:
圖片描述
代理人在這里有什么用處呢?沒(méi)有代理人,直接和房主買(mǎi)就好了???試想下,假如現(xiàn)在有了新的買(mǎi)房政策,交易完成后可以退稅,那么在不修改房主代碼的前提下,我們只需要修改此代理人的代碼即可。如果在其他地方賣(mài)房沒(méi)有此政策,只需要定義另外一個(gè)地區(qū)的代理人即可,這里實(shí)現(xiàn)了開(kāi)閉原則。其實(shí)代理模式還有很多好處和適用的場(chǎng)景。我們下面詳細(xì)來(lái)看。

2. 代理模式優(yōu)缺點(diǎn)

2.1 優(yōu)點(diǎn)

代理模式在客戶(hù)端代碼和真正的邏輯代碼中引入了一層代理,這樣做有很多好處:代理模式

  1. 隱藏邏輯的真正實(shí)現(xiàn)對(duì)象。上面的例子中,如果賣(mài)房人身份特殊,那么通過(guò)代理人來(lái)賣(mài)房,可以不讓買(mǎi)房人接觸到自己;
  2. 隱藏委托類(lèi)的某些行為,在代理類(lèi)認(rèn)為應(yīng)該觸發(fā)時(shí)再觸發(fā);
  3. 代理類(lèi)可以為委托類(lèi)的行為附加一些邏輯處理,例如上例中的退稅。

2.2 缺點(diǎn)

  1. 代理類(lèi)和委托類(lèi)實(shí)現(xiàn)同一個(gè)接口,因此只能面向接口代理;
  2. 代理類(lèi)和委托類(lèi)實(shí)現(xiàn)同一個(gè)接口。即使代理類(lèi)只想代理某個(gè)行為,也需要實(shí)現(xiàn)接口所有方法;
  3. 代理類(lèi)和委托類(lèi)需要一一對(duì)應(yīng)。如果你有段邏輯需要對(duì)所有的方法都附加上,靜態(tài)代理是無(wú)法實(shí)現(xiàn)的。

3. 代理模式適用場(chǎng)景

針對(duì)代理模式的三個(gè)優(yōu)點(diǎn),我們來(lái)看看有哪些適用場(chǎng)景。

  1. 遠(yuǎn)程調(diào)用代理:在分布式系統(tǒng)中,我們經(jīng)常會(huì)調(diào)用其他系統(tǒng)的服務(wù)。通過(guò)代理模式,可以對(duì)客戶(hù)端代碼隱藏遠(yuǎn)程調(diào)用的細(xì)節(jié);
  2. 虛代理:有一個(gè)典型的場(chǎng)景,加載一個(gè)包含大量大 size 圖片的頁(yè)面時(shí),為了更好的用戶(hù)體驗(yàn),可以通過(guò)圖片代理類(lèi)先把圖片的位置占好,保證排版的正確。當(dāng)滾動(dòng)到某個(gè)圖片位置的時(shí)候才去加載圖片;
  3. 保護(hù)代理:當(dāng)委托對(duì)象需要訪(fǎng)問(wèn)權(quán)限控制時(shí),可以通過(guò)代理類(lèi)來(lái)控制權(quán)限進(jìn)行保護(hù);
  4. 智能指引:為委托對(duì)象增加一層控制。比如記錄訪(fǎng)問(wèn)次數(shù),當(dāng)為 0 的時(shí)候,可以釋放掉。第一次引用一個(gè)對(duì)對(duì)象時(shí),把它裝入內(nèi)存。訪(fǎng)問(wèn)委托對(duì)象前,檢查是否已經(jīng)有其他訪(fǎng)問(wèn)已經(jīng)鎖定了它,以確保其他對(duì)象不能改變它。

4. 小結(jié)

代理模式由 Suject 接口,RealSubject 實(shí)現(xiàn)和 Proxy 類(lèi)構(gòu)成。Proxy 類(lèi)同樣要實(shí)現(xiàn) Suject 接口。同時(shí) Proxy 類(lèi)依賴(lài) RealSubject 類(lèi)。代理模式對(duì)方的調(diào)用增加了間接性。利用間接性,可以加入額外的邏輯。這也是我們常說(shuō)的 AOP,即面向切面編程。