标签:
今天听代理模式的一点总结:
新建一个接口
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(); } }
标签:
原文地址:http://www.cnblogs.com/yaoyao66123/p/4713816.html