读书人

静态代理~如何为一个已经实现得方法在

发布时间: 2012-10-25 10:58:57 作者: rapoo

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

/**  代理模式语义:有一个类,然后想对这个类进行增强,把一些控制类放入这个类的某个方法的前后,因为是对方法的扩展,所以把方法变成接口实现插拔"///从某种意义上说两种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插孔能力*/

读书人网 >软件架构设计

热点推荐