標籤:
今天聽代理模式的一點總結:
建立一個介面
package com.proxy;public interface MoveAble { void move();}
建立一個tank類 實現MoveAble
package com.proxy;import java.util.Random;public class Tank implements MoveAble{ @Override public void move() { // TODO Auto-generated method stub System.out.println("坦克正在運行"); try { new Thread().sleep(new Random().nextInt(10000)); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
要記錄move這個方法的執行時間 我們有兩種方法可以實現
package com.proxy;/** * 通過繼承的方式實現代理 * 繼承方式不靈活 如果要添加記錄日誌功能的時候 要建立一個類 繼承tank2 * 重寫move 方法 在裡面添加記錄日誌的功能 如果要添加n多個功能 要建立n多個類 產生 * 類爆炸 */public class Tank2 extends Tank { /** * 要計運算元類方法的執行時間 */ @Override public void move() { long start =System.currentTimeMillis(); super.move();//tank2也是一個代理 調用他實際上調用的是他父類的方法 long end = System.currentTimeMillis(); System.out.println("time: "+(end-start)); } }
第二種方法 impl
package com.proxy;/* * 一個類裡面有另外一個類的實現 彙總 */public class TankLogProxy implements MoveAble{ Tank t;//要測試的對象 這個對象的方法和 這個類的方法一樣 調用別人的方法 //TankLogProxy 是t 的一個代理 public TankLogProxy(Tank t) { super(); this.t = t; } @Override public void move() { System.out.println("tank start"); t.move(); System.out.println("tank stop"); }}
測試
package com.proxy;public class doMain { public static void main(String[] args) { MoveAble m = new Tank2(); m.move();//調用的是他父類的方法 MoveAble m1 = new TankTimeProxy(new Tank()); m1.move(); }}
更推薦繼承的方式進行實現
===================分割線=========================
如果想添加記錄日誌的功能 我們使用彙總的方式就比較簡單靈活了
TankTimeProxy 修改如下
package com.proxy;/* * 一個類裡面有另外一個類的實現 彙總 */public class TankTimeProxy implements MoveAble{ MoveAble t; public TankTimeProxy(MoveAble t) { super(); this.t = t; } @Override public void move() { // TODO Auto-generated method stub long start =System.currentTimeMillis(); t.move(); long end = System.currentTimeMillis(); System.out.println("time: "+(end-start)); }}
添加 TankLogProxy
package com.proxy;/* * 一個類裡面有另外一個類的實現 彙總 */public class TankLogProxy implements MoveAble{ MoveAble t;// MoveAble 有 move 方法 可以代理所有MoveAble 的內容 public TankLogProxy(MoveAble t) { super(); this.t = t; } @Override public void move() { System.out.println("tank start"); t.move(); System.out.println("tank stop"); }}
測試
package com.proxy;public class doMain { public static void main(String[] args) { // Tank tank =new Tank();// TankTimeProxy ttp = new TankTimeProxy(tank);// MoveAble m = ttp;// m.move();//調用的是時間代理對象 內部調用的是 傳進入的Tank tank =new Tank(); 對象的move 方法 //如果我們要移動的時添加記錄日誌的功能 Tank t =new Tank(); TankTimeProxy tankTimeProxy = new TankTimeProxy(t); TankLogProxy tankLogProxy = new TankLogProxy(tankTimeProxy); MoveAble m1 = tankLogProxy; m1.move(); }}
java 代理模式