標籤:ace and jin style art extends blog 目標 繼承
通過代理對象訪問目標對象,這樣可以增加對目標對象的額外操作,達到擴充目標對象功能的目的,如spring事務、AOP等。
要點:1)抽象角色:通過介面或抽象類別聲明真實角色實現的業務方法。(例子中的Move)
2)代理角色:實現抽象角色,是真實角色的代理(例子中的*Proxy)
3)真實角色:實現抽象角色,定義真實角色所要實現的商務邏輯,供代理角色調用。(例子中的MoveImpl)
一、靜態代理
1、繼承實現靜態代理
移動介面
public interface Move { public void move();}
移動實作類別
public class MoveProxy implements Move { public void move() { System.out.println("汽車正在運行......"); }}
車代理類
public class CarProxy extends MoveImpl { @Override public void move() { long start_time = new Date().getTime(); System.out.println("汽車開始運行......"); super.move(); long end_time = new Date().getTime(); System.out.println("汽車結束運行,已耗用時間:" + (end_time - start_time)); }}
測試
public class Model { public static void main(String[] args) { CarProxy carProxy = new CarProxy(); carProxy.move(); }}
2、彙總實現靜態代理
推薦使用彙總實現動態代理,這樣可以方便實現多個代理順序交換,方便擴充,如下
移動介面
public interface Move { public void move();}
移動實作類別
public class MoveProxy implements Move { public void move() { System.out.println("汽車正在運行......"); }}
車代理類
public class CarProxy extends MoveImpl { @Override public void move() { long start_time = new Date().getTime(); System.out.println("汽車開始運行......"); super.move(); long end_time = new Date().getTime(); System.out.println("汽車結束運行,已耗用時間:" + (end_time - start_time)); }}
日誌代理
public class LogProxy implements Move { private Move obj; public LogProxy(Move obj) { this.obj = obj; } public void move() { System.out.println("日誌開始......"); obj.move(); System.out.println("日誌結束......"); }}
測試
public class Model { public static void main(String[] args) { //推薦使用彙總實現動態代理,這樣可以方便實現多個代理順序交換,方便擴充,如下 MoveImpl moveProxy = new MoveImpl(); CarPropxy carPropxy = new CarPropxy(moveProxy); LogProxy logProxy = new LogProxy(carPropxy); logProxy.move(); System.out.println(); MoveImpl moveProxy1 = new MoveImpl(); CarPropxy carPropxy1 = new CarPropxy(moveProxy1); LogProxy logProxy1 = new LogProxy(carPropxy1); logProxy1.move(); }}
二、動態代理
移動介面
public interface Move { public void move();}
移動實作類別
public class MoveProxy implements Move { public void move() { System.out.println("汽車正在運行......"); }}
日誌代理
public class LogHandler implements InvocationHandler { private Object obj; public LogHandler(Object obj) { this.obj = obj; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("日誌開始......"); method.invoke(obj); System.out.println("日誌結束......."); return null; }}
時間代理
public class TimeHandler implements InvocationHandler { private Object obj; public TimeHandler(Object obj) { this.obj = obj; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { long start_time = new Date().getTime(); System.out.println("汽車開始運行......"); method.invoke(obj); long end_time = new Date().getTime(); System.out.println("汽車結束運行,已耗用時間:" + (end_time - start_time)); return null; }}
測試
public class Model { public static void main(String[] args) { MoveImpl move = new MoveImpl(); Class c = move.getClass(); TimeHandler t = new TimeHandler(move); Move m = (Move) Proxy.newProxyInstance(c.getClassLoader(), c.getInterfaces(), t); LogHandler l = new LogHandler(m); Move m1 = (Move) Proxy.newProxyInstance(c.getClassLoader(), c.getInterfaces(), l); m1.move(); }}
二者區別:JAVA學習篇--靜態代理VS動態代理
java設計模式(四)代理模式