首先講講代理模式。什麼是靜態代理,爲何須要動態代理?設計模式
定義:給目標對象提供一個代理對象,並由代理對象控制對目標對象的引用。
目的:1.經過引入代理對象來間接訪問目標對象,防止直接訪問目標對象給系統帶來的沒必要要複雜性;2.經過代理對象對原有的業務加強。ide
如圖代理模式類圖:測試
簡單看了下圖解就開始上代碼吧
1.先定義一個抽象對象即公共接口類this
/** * 負責生產男性用品 */ public interface ManToolFactory { public void saleManTool(String size); }
2.真實對象spa
/** * A工廠負責生產男性用品 */ public class AManFactory implements ManToolFactory { @Override public void saleManTool(String size) { System.out.println("A工廠出售男性用品,大小爲" + size ); } }
3.代理對象設計
/** * 靜態代理類 */ public class StaticProxy implements ManToolFactory { // 代理的真實對象,多個的話考慮公用object也就是動態代理的實現 private ManToolFactory manFactory;// 相似搬運工,代理真實對象的方法 public StaticProxy(ManToolFactory manFactory) { this.manFactory= manFactory; } @Override public void saleManTool(String size) { dosomeThingBefore();//前置加強 manFactory.saleManTool(size); dosomeThingAfter();//後置加強 } public void dosomeThingBefore() { System.out.println("售前服務,負責產品的調研工做"); } public void dosomeThingAfter() { System.out.println("售後服務,送門服務,三包等"); } }
測試類:代理
public class StaticProxyTest { public static void main(String[] args) { // 真實對象:A工廠生產男性用品 ManToolFactory manToolFactory = new AManFactory(); // 代理對象:負責代購男性用品 StaticProxy staticProxy = new StaticProxy(manToolFactory); // 代理對象完成代購 staticProxy.saleManTool("100"); } }
/** * 負責生產女性用品的抽象對象 */ public interface WomanToolFactory { public void saleWomanTool(Double length); } /** * B工廠專門負責生產男性用品(真實對象) */ public class BWomanFactory implements WomanToolFactory { @Override public void saleWomanTool(Double length) { System.out.println("B工廠生產女性用品,長度" + length); } } 此時代理類須要修改,開始思路以下 public class StaticProxy implements ManToolFactory,WomanToolFactory { private ManToolFactory manFactory; private WomanToolFactory womanFactory; @Override public void saleManTool(String size) { //TODO } @Override public void saleWomanTool(Double length) { //TODO }
那若是再多一個業務,代購點別的產品,那是否是又要再實現一個接口,這樣就違背了設計模式的原則:開閉原則,擴展能力差,可維護性差.
所以動態代理就出現了。動態代理請看下節code