設計模式之代理模式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.利用繼承
如果不能在原來類上添加函數(shù)。則可以利用新建類繼承extends原來類,重寫方法,在super.方法前后加入此函數(shù)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實現(xiàn)接口函數(shù),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、利用聚合實現(xiàn)多個代理。下面寫時間代理(運行的時間)和日志代理(打印),可以通過改變client類上代理調(diào)用順序來改變出現(xiàn)的順序
------------- 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
兔小翊 閱讀(128)
評論(0) 編輯 收藏