需求:設計一個車類,具有方法run,現需要設計一個方案計算它的前後行駛時間。
- 一般來說該類可以這樣寫
public class car{
long start,end;
private void before(){
start=System.currentTimeMillis();
System.out.println("開車前時間:"+start);
}
private void after(){
end=System.currentTimeMillis();
System.out.println("開車後時間:"+end+".\n總耗時:"+(end-start)+"毫秒");
}
pubic void run(){
try {
after();
System.out.println("正在開車~~~");
Thread.sleep((int)(Math.random()*100));
before();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
- 結果爲:
開車前時間:1503127134747
正在開車~~~
開車後時間:1503127135124.
總耗時:377毫秒
Process finished with exit code 0
但是爲了可以擴展,一般採取寫法
Icar.java (汽車接口)
package cn.niriqiang.demo;
/**
* Created by fengyuwusong on 2017/8/19 14:53.
*/
public interface ICar {
public void run();
}
CarImpl 汽車實現類
package cn.niriqiang.demo;
/**
* Created by fengyuwusong on 2017/8/19 14:54.
*/
public class CarImpl implements ICar{
@Override
public void run() {
try {
System.out.println("正在開車~~~");
Thread.sleep((int)(Math.random()*1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
CarProxy 汽車計時功能代理
package cn.niriqiang.demo;
/**
* Created by fengyuwusong on 2017/8/19 14:58.
*/
public class Carproxy implements ICar{
private ICar car;
long start,end;
public Carproxy(ICar car) {
this.car = car;
}
@Override
public void run() {
before();
car.run();
after();
}
private void before(){
start=System.currentTimeMillis();
System.out.println("開車前時間:"+start);
}
private void after(){
end=System.currentTimeMillis();
System.out.println("開車後時間:"+end+".\n總耗時:"+(end-start)+"毫秒");
}
}
main 測試方法
package cn.niriqiang.demo;
/**
* Created by fengyuwusong on 2017/8/19 14:55.
*/
public class main {
public static void main(String[] args) {
ICar car=new CarImpl();
Carproxy carproxy=new Carproxy(car);
carproxy.run();
}
}
以上寫法即爲代理模式的靜態代理,這樣的好處是加入需求改變,需要在汽車行駛前後添加新功能時,我們可以根據功能給汽車添加新的代理,例如:
CarLogProxy.java 給汽車添加日誌功能
package cn.niriqiang.demo;
/**
* Created by fengyuwusong on 2017/8/19 15:27.
*/
public class CarLogProxy implements ICar{
ICar car;
public CarLogProxy(ICar car) {
this.car = car;
}
private void before(){
System.out.println("開車前日誌:xxxxx...");
}
private void after(){
System.out.println("開車後日志:xxxxx...");
}
@Override
public void run() {
before();
car.run();
after();
}
}
我們給man方法稍作改變即可得到新功能(既添加了計時又添加了日誌功能的汽車)
package cn.niriqiang.demo;
/**
* Created by fengyuwusong on 2017/8/19 14:55.
*/
public class main {
public static void main(String[] args) {
ICar car=new CarImpl();
Carproxy carproxy=new Carproxy(car);
CarLogProxy carLogProxy=new CarLogProxy(carproxy);
carLogProxy.run();
}
}
結果
開車前日誌:xxxxx…
開車前時間:1503127842768
正在開車~~~
開車後時間:1503127842835.
總耗時:67毫秒
開車後日志:xxxxx…