随笔-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 兔小翊 阅读(124) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: