静态代理~怎么为一个已经实现得方法在前后加逻辑~剖析插头和插座

/**
  代理模式语义:有一个类,然后想对这个类进行增强,把一些控制类放入这个类的某个方法的前后,因为是对方法的扩展,所以把方法变成接口实现插拔

"/
//从某种意义上说两种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插孔能力
*/

你可能感兴趣的:(静态代理)