設計模式之代理模式

首先來了解一下什麼是代理模式?java

所謂代理模式就是對象經過代理來控制對真實對象的訪問.編程

舉個生活中的例子,咱們平常購物不會直接去聯繫廠家購買,而是經過網上商城,線下超市等形式間接的購買.那麼這些商城或者說超市就是就是咱們的代理.咱們的代理會去聯繫廠家,幫咱們代購商品.設計模式

設計模式包含一下三大核心模塊:安全

Subject (抽象主題角色):它是一個真實主題和代理主題都要實現的一個抽象接口.這樣在調用真實主題的地方均可以用代理主題.ide

Proxy(代理主題):咱們的主角,它包含了對真實主題的引用,從而能夠隨意的操做真實主題對象,在須要的時候建立和刪除真實的對象.並且代理主題提供了和真實主題相同的接口,以便替代真實的主題.代理主題每每還會執行更多的操做,好比在調用真實主題操做以前進行安全性校驗,在執行真實主題的調用後,執行日誌處理等等.this

RealProject(真是主題):這是一個傲嬌的小公主輕易不與外界接觸,一切事宜都交給管家(Proxy)來處理.設計

代理模式的優勢和缺點:代理

1. 可以協調調用者和被調用者,在必定程度上下降了系統的耦合度。日誌

2. 客戶端能夠針對抽象主題角色進行編程,增長和更換代理類無須修改源代碼,符合開閉原則,系統具備較好的靈活性和可擴展性。對象

缺點:就是實現代理功能,增長了額外的工做量.

下面經過簡單的案例來了解下代理模式的具體實現:

真實主題和代理主題都要實現的接口

public interface IBuy{
    void buy();
}

定義真實主題類

public class RealBuyer implements IBuy{
    @Override
    public void buy(){
        System.out.println("餓死了,我想吃蛋撻了");
    }
}

定義代理主題

public class ProxyBuyer implements IBuy{
    private RealBuy realBuy = null;
    @Override
    public void buy(){
        if(this.isEggTart()){     //是蛋撻
            realBuy = new RealBuy();
            realBuy.buy();   //買
            this.recordHistory();//收藏一下
        }
        
    }
    //檢查是不是吃的
    public boolean isEggTart(){
        System.out.println("若是是蛋撻我就吃,不是我就不買!");
        return true;
    }
    //買完了記錄到個人購買記錄中,以便往後在來一單
    public void recordHistory(){
        System.out.println("親,這是你最喜歡的蛋撻,要不要再來一單?");
    }
}

客戶端調用:

public class Main{
    public static void main(String[] args){
        IBuy buyer = new ProxyBuyer();
        buyer.buy();
    }
}
相關文章
相關標籤/搜索