設計模式(2) 代理模式 靜態代理

  • 需求:設計一個車類,具有方法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…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章