隨筆-3  評論-0  文章-0  trackbacks-0
          設計模式之代理模式01
          問題:如何知道一個方法的運行時間:
          引出代理
          ----------------------
          1.直接在原來類上修改
          利用System.currentTimeMillis()
          public void Move() {
                  
          long start=System.currentTimeMillis();
                  System.out.println(
          "Tank Moving");
                  
          try {
                      Thread.sleep(
          new Random().nextInt(10000));
                  } 
          catch (InterruptedException e) {            
                      e.printStackTrace();
                  }
                  
          long end=System.currentTimeMillis();
                  System.out.println(
          "time:"+(end-start));
                  
              }


          2.利用繼承
          如果不能在原來類上添加函數。則可以利用新建類繼承extends原來類,重寫方法,在super.方法前后加入此函數System.currentTimeMillis()
          public class Tank2 extends Tank{
              @Override
              
          public void Move() {
                  
          long start=System.currentTimeMillis();
                  
          super.Move();
                  
          long end=System.currentTimeMillis();
                  System.out.println(
          "time2:"+(end-start));
              }
              
          }

          3.利用聚合。新建一個類B實現接口函數,B類里面有需要測試的類A的對象。相當于B是A的一個代理。實際上,第二種方法也算是一個代理
          public class Tank3 implements Moveable{        
              
          public Tank3(Tank myt) {
                  
          super();
                  
          this.myt=myt;        
              }
              Tank myt;    
              
              @Override
              
          public void Move() {
                  
          long start=System.currentTimeMillis();
                  myt.Move();
                  
          long end=System.currentTimeMillis();
                  System.out.println(
          "time3:"+(end-start));
              }    
          }

          4、利用聚合實現多個代理。下面寫時間代理(運行的時間)和日志代理(打印),可以通過改變client類上代理調用順序來改變出現的順序
          ------------- Moveable .java-------------
          package mypro.cn;
          public interface Moveable {
              
          public void Move();
          }

          ---------------tank.java-----------
          package mypro.cn;
          import java.util.Random;
          public class Tank implements Moveable{

              
          public void Move() {
                  System.out.println(
          "Tank Moving");
                  
          try {
                      Thread.sleep(
          new Random().nextInt(10000));
                  } 
          catch (InterruptedException e) {            
                      e.printStackTrace();
                  }
                  
              }
          }
          ----------- TankTimeProxy.java-------------------------
          package mypro.cn;
          import java.text.DateFormat;

          public class TankTimeProxy implements Moveable{        
              
          public TankTimeProxy(Moveable myt) {
                  
          super();
                  
          this.myt=myt;        
              }
              Moveable myt;    
              
              @Override
              
          public void Move() {
                  
          long start=System.currentTimeMillis();
                  java.util.Date date 
          = new java.util.Date();
                  String currTime 
          = DateFormat.getDateTimeInstance().format(date);
                  System.out.println(
          "starttime:"+currTime);
                  myt.Move();
                  
          long end=System.currentTimeMillis();
                  System.out.println(
          "time:"+(end-start));
              }    
          }

          ------------------------- TankLogProxy .java-------------------------------
          package mypro.cn;

          public class TankLogProxy implements Moveable{        
              
          public TankLogProxy(Moveable myt) {
                  
          super();
                  
          this.myt=myt;        
              }
              Moveable myt;    
              
              @Override
              
          public void Move() {//日志代理
                  System.out.println("tank start");
                  myt.Move();        
                  System.out.println(
          "tank stop");    }    
          }

          --------------------- Client .java----------------------------
          package mypro.cn;
          public class Client {
              
          public static void main(String[] args) {
                  Tank t
          =new Tank();
                  TankTimeProxy ttp
          =new TankTimeProxy(t);//先時間代理,即先包裝一層時間
                  TankLogProxy tlp=new TankLogProxy(ttp);//再日志代理,最外層包裝日志
                  Moveable m=tlp;
                  m.Move();
              }
          }
           
          改變包裝順序,先包裝日志,再包裝時間:
           
              


          posted on 2012-06-28 22:16 兔小翊 閱讀(131) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          主站蜘蛛池模板: 焉耆| 鲜城| 汶上县| 广西| 山丹县| 靖远县| 察雅县| 涟水县| 呼图壁县| 普安县| 西吉县| 康乐县| 东丽区| 曲阳县| 河北省| 和田县| 山丹县| 灵川县| 湄潭县| 当涂县| 长阳| 龙门县| 白山市| 海兴县| 玉林市| 科技| 淮安市| 左贡县| 北京市| 崇仁县| 西青区| 郧西县| 大埔区| 望都县| 泌阳县| 易门县| 哈密市| 富宁县| 修文县| 文山县| 河源市|