静态代理 向程序前后增加逻辑方法

来源:互联网 发布:淘宝开店教程ppt 编辑:程序博客网 时间:2024/06/14 14:56

增加方法有两种

1.继承(不推荐) 

2.聚合(推荐)相当于静态代理

首先有一个moveable接口

package com.bjsxt.proxy;  public interface Moveable { void move();  }

一个Tank类实现Moveable接口

package com.bjsxt.proxy;  import java.util.Random;  public class Tank implements Moveable { @Override public void move() { System.out.println("Tank Moving..."); try { Thread.sleep(new Random().nextInt(10000)); } catch (InterruptedException e) { e.printStackTrace(); } } } 
类Tank2继承tank类
package com.bjsxt.proxy; /**  * Tank2也相当于一个Tank的代理 对于Tank2调用的任何方法都会调用Tank的方法  * @author 落叶  * 继承  */ public class Tank2 extends Tank { @Override public void move() { long start = System.currentTimeMillis(); super.move(); long end = System.currentTimeMillis(); System.out.println(end-start); } }
类Tank3中聚合了tank类

package com.bjsxt.proxy;  /**  * Tank3相当于Tank的一个代理 调用Tank3的任何方法实际上都是调用的Tank的方法  * @author 落叶  * 聚合  */ public class Tank3 implements Moveable { Moveable t; public Tank3(Moveable t) { super(); this.t = t; } @Override public void move() { long start = System.currentTimeMillis(); t.move(); long end = System.currentTimeMillis(); System.out.println(end-start); } } 

实现添加时间的代理类:

package com.bjsxt.proxy;  import java.util.Date;  /**  *   * @author 落叶  *   */ public class TankTimeProxy implements Moveable { Moveable t; public TankTimeProxy(Moveable t) { super(); this.t = t; } @Override public void move() { long start = System.currentTimeMillis(); System.out.println("开始时间:"+new Date(start)); t.move(); long end = System.currentTimeMillis(); System.out.println("结束时间:"+new Date(end)); } } 

实现添加日志的代理:

package com.bjsxt.proxy;  /**  * @author 落叶  */ public class TankLogProxy implements Moveable {  Moveable t;  public TankLogProxy(Moveable t) { super(); this.t = t; }  @Override public void move() { System.out.println("日志开始...."); t.move(); System.out.println("日志结束...."); }  } 


用继承实现各种各样代理功能要叠加的话就会有越来越多的类生成:

即 先时间后日志 用tank4继承TankLogProxy然后添加时间;

要 先日志后时间的话 只能用Tank5继承TankTimeProxy然后添加日志;

代理越多类就会越来越多。


而如果使用聚合则简单:

先日志后时间;

package com.bjsxt.proxy;   public class Client1 { public static void main(String[] args) throws Exception { Tank t = new Tank(); TankTimeProxy ttp = new TankTimeProxy(t); TankLogProxy tlp = new TankLogProxy(ttp); Moveable m = tlp; m.move(); } }
先时间后日志;

package com.bjsxt.proxy;   public class Client1 { public static void main(String[] args) throws Exception { Tank t = new Tank(); TankLogProxy tlp = new TankLogProxy(t); TankTimeProxy ttp = new TankTimeProxy(tlp); Moveable m = ttp; m.move(); } }