天天看點

代理設計模式

代理設計模式

1什麼是代理設計模式?

當某一個對象發生某一個事件時,通知另一個對象,讓另一個對象做某事

2代理例子

家裡有一個寶寶Baby,它有兩種行為:"哭"cry和"餓"hungry。

public class Baby{
    public void cry(){
    }     public void hungry(){
    }    }           

當"哭"事件發生時我需要去"照顧"look after,當"餓"發生時我需要去"喂"feed。我可以請一個"保姆"nanny來去做這些事,這就是代理

public class Nanny{    public void lookAfter(){        System.out.println("哄寶寶");    }
    public void feed(){        System.out.println("喂寶寶");    }}           

然後保姆任職後

public class Baby{    public void cry(){        new Nanny().lookAfter();    }        public void hungry(){        new Nanny().feed();    }}           

但是到這裡有個問題:當寶寶一哭就雇用一個保姆去照看,當寶寶一餓又新雇傭。寶寶每次觸發都要新雇一個。顯然這樣是不合理的。

public class Baby{       Nanny nan = new Nanny();
    public void cry(){        nan.lookAfter();    }      public void hungry(){        nan.feed();    }}           

改成這樣之後,都是由定義好的nan這一個對象來監管,而不是每次都建立一個。但是這樣還是存在問題,因為這樣寫死在Baby裡面,也就是說每建立一個Baby對象或者說每一個嬰兒出生它内部已經定義了保姆已經綁定了,而保姆應該是後來請的,并且是可以換的。下面開始進行代理設計模式

3代理模式設計步驟

像上面所說保姆是可換的,但也是要滿足代理條件的,也就是當保姆的條件,因為并不是什麼人都可以

也就是編寫一個規範即接口,隻有實作了此接口的才能做對應的代理

public interface BabyProtocol{        public void lookAfter();    public void feed();
}

public class Baby{
    public BabyProtocol nan;
    public void cry(){        nan.lookAfter();    }      public void hungry(){        nan.feed();    }}           

這時就需要外界去傳一個實作了BabyProtocal接口的對象

public class Nanny implements BabyProtacol{     public void lookAfter(){        System.out.println("哄寶寶");    }
    public void feed(){        System.out.println("喂寶寶");    }}           
public class Test{    public static void main(String[] args){        Baby baby = new Baby();        baby.nan = new Nanny();        baby.cry();        baby.hungry();    }}           

這樣那麼才是之後給baby設定保姆,并且可以換,但是要是實作了Babyprotocal的類的對象

4總結

一個對象的的行為讓另一個對象來監聽,另一個對象就是代理

步驟:

1.定義好協定

2.遵守協定

3.成為代理

4.觸發代理方法

代理設計模式

它,

繼續閱讀