首先來了解一下什麼是代理模式?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(); } }