android設計模式二十三式(八)——代理模式(Proxy)

代理模式

代理模式,看起來非常像裝飾器模式。

對裝飾器模式來說,裝飾者(decorator)和被裝飾者(decoratee)都實現同一個 接口。對代理模式來說,代理類(proxy class)和真實處理的類(real class)也都實現同一個接口。此外,不論我們使用哪一個模式,都可以很容易地在真實對象的方法前面或者後面加上自定義的方法。

然而,實際上,在裝飾器模式和代理模式之間還是有很多差別的。裝飾器模式關注於在一個對象上動態的添加方法,然而代理模式關注於控制對對象的訪問。換句話 說,用代理模式,代理類(proxy class)可以對它的客戶隱藏一個對象的具體信息。因此,當使用代理模式的時候,我們常常在一個代理類中創建一個對象的實例。並且,當我們使用裝飾器模式的時候,我們通常的做法是將原始對象作爲一個參數傳給裝飾者的構造器。使用代理模式,代理和真實對象之間的的關係通常在編譯時就已經確定了,而裝飾者能夠在運行時遞歸地被構造。  

代理,偏重因自己無法完成或自己無需關心,需要他人干涉事件流程,更多的是對對象的控制。
裝飾,偏重對原對象功能的擴展,擴展後的對象仍是是對象本身。

代理模式,注重對對象某一功能的流程把控和輔助。它可以控制對象做某些事,重心是爲了借用對象的功能完成某一流程,而非對象功能如何。
裝飾模式,注重對對象功能的擴展,它不關心外界如何調用,只注重對對象功能的加強,裝飾後還是對象本身。

對於代理類,如何調用對象的某一功能是思考重點,而不需要兼顧對象的所有功能;
對於裝飾類,如何擴展對象的某一功能是思考重點,同時也需要兼顧對象的其它功能,因爲再怎麼裝飾,本質也是對象本身,要擔負起對象應有的職責。

依舊我們來舉個例子,好理解一下,小明想要出國去旅遊,但是呢,小明是第一次,所以,對整個流程都不熟悉,需要一個人來幫他來完成這些事情,所以就找了一家旅遊公司,那麼這個旅遊公司呢,就是這個代理了,在小明出國旅遊之前,就確定了是小明與旅遊公司的關係。

看一下代碼

/**
 * @author: hx
 * @Time: 2019/5/13
 * @Description: People
 */
public interface People {
    /**
     * 人們都可以去旅遊
     */
    void travelling();
}

/**
 * @author: hx
 * @Time: 2019/5/13
 * @Description: Xiaoming
 */
public class Xiaoming implements People {
    @Override
    public void travelling() {
        System.out.println("小明去旅遊");
    }
}

/**
 * @author: hx
 * @Time: 2019/5/13
 * @Description: TravelAgency
 */
public class TravelAgency implements People {
    private Xiaoming mXiaoming;

    public TravelAgency() {
        mXiaoming = new Xiaoming();
    }

    @Override
    public void travelling() {
        beforeTravel();
        mXiaoming.travelling();
        afterTravel();
    }

    /**
     * 旅遊前的事情
     */
    private void beforeTravel(){
        System.out.println("辦證");
        System.out.println("買機票");
        System.out.println("買保險");
        System.out.println("找導遊");
    }
    /**
     * 旅遊後的事情
     */
    private void afterTravel(){
        System.out.println("返程機票");
    }
}

小明出去旅個遊:

public static void main(String[] args){
    People agency = new TravelAgency();
    agency.travelling();
}

輸出結果:
辦證
買機票
買保險
找導遊
小明去旅遊
返程機票

採用一個代理類調用原有的方法,且對產生的結果進行控制。這種方法就是代理模式。

使用代理模式,可以將功能劃分的更加清晰,有助於後期維護!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章