代理設計模式
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.觸發代理方法

它,