静态代理~如何为一个已经实现得方法在前后加逻辑~剖析插头和插座
静态代理~怎么为一个已经实现得方法在前后加逻辑~剖析插头和插座
/** 代理模式语义:有一个类,然后想对这个类进行增强,把一些控制类放入这个类的某个方法的前后,因为是对方法的扩展,所以把方法变成接口实现插拔 "/ //从某种意义上说两种TimeProxy 都是Tank的代理,这两个都是代理的实现 //比如一个类Tank,想为这个move前后加些逻辑,方面一:继承,就重写他啊 class Tank{ public void move(){ } } class TimeProxy extends Tank{ public void move(){ long start = System.currentTimeMillis();//前逻辑 super.move(); long end = System.currentTimeMillis();//后逻辑 System.out.println(end-start); } } //方法二:聚合 class TimeProxy { Tank t; public void move(){ long start = System.currentTimeMillis();//前逻辑 t.move(); long end = System.currentTimeMillis();//后逻辑 System.out.println(end-start); } } /*区别是什么:用继承的话,类会随着需求的增加而无限的继承下去 下面看案例: 如果要再有一个log记录怎么办 当然第一种和第二种方法都要写LogProxy,如果我需要先记录日志后记录时间呢 在第一种方法下只能再写一个Log_Time_Proxy 但第二种方法就不用了,让他们都搞一个接口出来,想怎么插就怎么插 */ class Tank implements Moveable{ //坦克有一个Moveable接口 public void move(){ } } class TimeProxy implements Moveable{ //坦克 //Tank t; Moveable t ; public TimeProxy (Moveable t){ this.t = t; //接口插槽设置 } public void move(){ long start = System.currentTimeMillis();//前逻辑 t.move(); long end = System.currentTimeMillis();//后逻辑 System.out.println(end-start); } } class LogProxy implements Moveable{ //坦克 //Tank t; Moveable t ; public LogProxy(Moveable t){ this.t = t; //接口插槽设置 } public void move(){ Log记录//前逻辑 t.move(); } class Logic{ public static void main(String[] args){ Tank t = new Tank(); TimeProxy time = new TimeProxy(t); LogProxy log = new LogProxy(time); log.move(); } } /*注意:这里的Moveable t 我把他叫做接口中实体元件架,就相当于插座中的铜片片,这个铜片片可以来接收一个插头一样 implements Moveable-----使得自己可以变成一个标准件实体,自己可以被插入到别人的插槽中,方便赋予别人。我把他叫获得Moveable 插头能力 Moveable t ; public TimeProxy (Moveable t){ this.t = t; //接口插槽设置 } 这个则是使得自己有一个插孔,有一个铜片片可以接收别人的插入,我把他叫做Moveable插孔能力 */