《大話設計模式》——讀後感 (4)為別人做嫁衣?——靜態代理模式(1)
什麽是代理模式:
代理模式結構圖:
直接上代碼:
GiveGift接口:
package com.sjmx.staticProxy; public interface GiveGift { void giveDolls(); void giveFlows(); void giveChocolate(); }
真實實體:
package com.sjmx.staticProxy; public class Pursuit implements GiveGift { SchoolGirl girl; privateString name; public Pursuit(String name ,SchoolGirl girl){ this.girl = girl; this.name = name; } @Override public void giveDolls() { System.out.println(girl.getName() + ","+ this.name +"送你一個dolls"); } @Override public void giveFlows() { System.out.println(girl.getName()+ ","+ this.name +"送你一個Flows"); } @Override public void giveChocolate() { System.out.println(girl.getName() + ","+ this.name +"送你一個Chocolate"); } }
代理:
package com.sjmx.staticProxy; public class Proxy implements GiveGift{ Pursuit gg ; public Proxy(String name ,SchoolGirl girl ) { gg= new Pursuit(name,girl); } public void giveDolls() { gg.giveDolls(); } public void giveFlows() { gg.giveFlows(); } public void giveChocolate() { gg.giveChocolate(); } }
虛構的實體,真實對象想要對此實體進行某些操作:
package com.sjmx.staticProxy; public class SchoolGirl { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
客戶端代碼:
package com.sjmx.staticProxy; public class Client { public static void main(String[] args) { SchoolGirl girl = new SchoolGirl(); girl.setName("林風嬌"); Proxy p = new Proxy("柯南",girl); p.giveChocolate(); p.giveDolls(); p.giveFlows(); System.out.println("--------------"); Proxy p2 = new Proxy("易烊千璽",girl); p2.giveChocolate(); p2.giveDolls(); p2.giveFlows(); System.out.println("--------------"); Proxy p3 = new Proxy("王源",girl); p3.giveChocolate(); p3.giveDolls(); p3.giveFlows(); System.out.println("--------------"); } }
運行結果:
下面我們來分析一下代碼實現:
1、Pursuit真實實體實現了接口GiveGift,而Proxy也實現了接口GiveGift,並且代理類還擁有成員變量Pursuit。單單從這代碼結構看,是不是和裝飾模式有一點相似?
2、為什麽Pursuit實現GiveGift,而Proxy也要去實現GiveGift呢?因為他們兩個要做的事情是相同的,房東可以租房子,中介也可以租房子,只是中介是代理房東在操作而已,道理一樣!那我想知道,Proxy不去實現GiveGift接口行不行呢?答案是可以的,因為我代碼根本就沒有出現 @Override字樣;即使出現了也沒關系,去掉就可以了(建議是去實現GiveGift接口,省事啊)
3、客戶端知乎要知道Proxy能租房子就行了,我根本不需要知道Pursuit的實例對象到底是誰,有可能是Pursuit1、2 、3、4、5....N呢,我客戶根本不關心,我只需要知道Proxy即可,耦合度大大降低。
4、再來說說不好的地方,Proxy持有的是Pursuit,那假如我還有其他的實體呢?比如A,B,C,D,如果是這樣,僅有的一個Proxy是根本無法代理的,因為在代理類的構造方法中是要實例化具體的實現實體對象的。有人會說,那我多寫幾個Proxy好了,如果是這樣的話,那我有1000個具體實體,那你的Proxy是不是也要有1000個呢?這樣的量是面向對象無法接受的;
5、還有一個不好的地方,剛剛說的是同一個接口的不同實現類;現在如果我有多個接口,每個接口實現類也不同,你又如何去代理,難道還要寫多個Proxy?
《大話設計模式》——讀後感 (4)為別人做嫁衣?——靜態代理模式(1)