設計模式之代理模式

前面的幾篇文章講了簡單工廠模式、工廠模式、建造者模式幾種設計模式,其中這幾種設計模式分創建型
設計模式。設計模式分爲三大類:
第一類:創建型設計模式,常見的有單例模式、簡單工廠模式、工廠模式(抽象工廠模式),建造者模式......
第二類:結構型設計模式,常見的適配器模式、裝飾模式、代理模式、外觀模式......
第三類:行爲型設計模式,策略模式,模板方法模式,觀察者模式、迭代器模式......
今天的話我們來講解一下結構型設計模式中的代理模式。

代理模式比較好理解,也可以稱爲委託模式,在我們平常生活中的代理場景也很多,比如代理上網、代購、
請律師打官司,這些都屬於代理的場景。
一樣的,我們先來看看它的定義:
定義:爲其他對象提供一種代理以控制對這個對象的訪問。
代理模式中有如下角色:
Basic:基本接口,聲明委託類和代理類共同的接口方法。
Delegator:委託類,實現基本接口,真正進行操作。客戶端通過代理類間接的調用真實委託類的方法。
Proxy:代理類,持有委託類的引用,在其實現的接口方法中調用真實委託類實現的接口方法。
Client:客戶端。
接下來我們用一個例子來看看代碼。

比如我最近想買一部switch,但是內地的話會比香港的貴,平時上班也忙,剛好有個朋友就想過去香港,這樣
子的話,我就委託了他幫我買部switch。
因爲我想買,然後不方便去,最後就委託了朋友去幫我買。到這裏,我們就可以定義出一個基本接口了。

public interface IBuySwitch{
    void buy();
}

委託類:

public class LinLiYing implements IBuySwitch{


    public void work(){
        Log.e("TAG","上班沒空");
    }

    @Override
    public void buy() {
        Log.e("TAG","掏錢買買買Switch");
    }
}

代理類:

public class Proxy implements IBuySwitch{
    private IBuySwitch iBuySwitch;

    public Proxy(IBuySwitch iBuySwitch){
        this.iBuySwitch = iBuySwitch;
    }
    @Override
    public void buy() {
        iBuySwitch.buy();
    }
}

客戶端實際使用:

public class Client{
    public static void main(String [] args){
        IBuySwitch linliying = new LinLiYing();
        IBuySwitch proxy = new Proxy(linliying);
        proxy.buy();
    }
}

在這個例子中,我自己本身是屬於委託類,真正掏錢和真正想買switch的是我。所以我就是委託類:
我的朋友屬於代理類,持有我的引用,在接口方法中調用了委託者實現的接口方法。
我們看看客戶端如何去調用。

 

代理模式很簡單,只要記住以下關鍵點,簡單易實現:
(1)代理類與委託類實現同一接口
(2)在委託類中實現功能,在代理類的方法中中引用委託類的同名方法
(3)外部類調用委託類某個方法時,直接以接口指向代理類的實例,
這正是代理的意義所在:屏蔽。
代理模式場景描述:
(1)當我們想要隱藏某個類時,可以爲其提供代理類
(2)當一個類需要對不同的調用者提供不同的調用權限時,可以使用代理類來實現
(代理類不一定只有一個,我們可以建立多個代理類來實現,也可以在一個代理類中金進行權限判斷來進行
不同權限的功能調用)
(3)當我們要擴展某個類的某個功能時,可以使用代理模式,在代理類中進行簡單擴展(只針對簡單擴展,
可在引用委託類的語句之前與之後進行)
代理模式雖然實現了調用者與委託類之間的強耦合,但是卻增加了代理類與委託類之間的強耦合
(在代理類中顯式調用委託類的方法),而且增加代理類之後明顯會增加處理時間,拖慢處理時間。

 

再累再苦,只當自己是二百五,再艱再險,只當自己是二皮臉。與君共勉~

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