最近公司從新開發一個項目,為此對老的代碼進行評估分析發現有些地方是可以采用代理模式來進行的,為此對代理模式進行了一次理解:
代理模式:即為指定的目標對象提供一個代理商,由代理商來完成對目標對象的操作。
代理類圖:
抽象對象角色或者接口角色:聲明了目標對象和代理對象的共同接口,這樣一來在任何可以使用目標對象的地方就都可以使用代理對象。
目標對象角色:定義了所需要代理對象的真實對象。
代理對象角色:代理對象內部含有目標對象的引用,從而可以在任何時候操作目標對象;代理對象通常在客戶端調用目標對象之前或之后,執行某個操作,而不是單純直接調用真實對象。
接口:
public interface Subject { void doSomething(); }
目標對象角色:
package com.njupt.study.designmodle.proxy; public class RealSubject implements Subject { @Override public void doSomething() { System.out.println("做些什么呢?"); } }
代理對象角色:
package com.njupt.study.designmodle.proxy; public class ProxySubject implements Subject { private RealSubject realSubject; public ProxySubject() { if(realSubject == null) { realSubject = new RealSubject(); } } @Override public void doSomething() { System.out.println("befor do something"); realSubject.doSomething(); System.out.println("after do something"); } }
客戶端訪問:
package com.njupt.study.designmodle.proxy; public class Client { /** * @param args */ public static void main(String[] args) { Subject subject = new ProxySubject(); subject.doSomething(); } }
輸出:
總結:
代理模式的功能 : 通過創建一個代理對象,用這個代理對象去代表真實的對象,客戶端使用這個代理對象來操作真實的對象(當客戶端操作這個代理對象的時候,實際上功能最終還是會由真實的對象來完成,只不過是通過代理操作的,也就是客戶端操作代理,代理操作真正的對象)
下面以人去買車來作為實例講解如下:
抽象的接口:
package com.njupt.study.designmodle.proxy; /** * 新建一個買車的接口 * @author Pony * */ public interface Buy_Car { public void buy_mycar(); }
真實對象:
package com.njupt.study.designmodle.proxy; public class People implements Buy_Car { private int cash; private String vip; private String username; @Override public void buy_mycar() { System.out.print(username+"是vip 客戶,可以直接購買新車!"); } public int getCash() { return cash; } public void setCash(int cash) { this.cash = cash; } public String getVip() { return vip; } public void setVip(String vip) { this.vip = vip; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } }
代理對象;
package com.njupt.study.designmodle.proxy; /** * people類不能擁有車,必須經過proxy代理類的認證,符合條件之后才可以擁有車輛,新建一個代理,這個代理類來考察當前的people是否有資格進行買車: * @author Pony * */ public class ProxyClass implements Buy_Car { private People people; public People getPeople() { return people; } public void setPeople(People people) { this.people = people; } @Override public void buy_mycar() { if (people.getVip() == "vip") { people.buy_mycar(); return; } if (people.getCash() >= 50000) { System.out.println(people.getUsername() + "買了新車,交易結束!"); } else { System.out.println(people.getUsername() + "錢不夠,不能買車,繼續比賽!"); } } }
客戶端:
package com.njupt.study.designmodle.proxy; public class RunClient { /** * @param args */ public static void main(String[] args) { People people_1 =new People(); people_1.setCash(60000); people_1.setUsername("jeck"); People people_2 =new People(); people_2.setCash(40000); people_2.setUsername("rose"); People people_3 =new People(); people_3.setCash(0); people_3.setUsername("tom"); people_3.setVip("vip"); ProxyClass proxy_buy = new ProxyClass(); proxy_buy.setPeople(people_1); proxy_buy.buy_mycar(); proxy_buy.setPeople(people_2); proxy_buy.buy_mycar(); proxy_buy.setPeople(people_3); proxy_buy.buy_mycar(); } }
運行結果如下: