設計模式之Future模式例子

在我認爲,實例教學比理論教學更加容易理解,並且理論知識網上一大堆,這裏就不重複了,所以記錄下Future模式的一種實現例子,以備以後可以查看。


如果不太懂Future模式時幹什麼的,最好先普及下理論知識再來看更好。


好,現在我們就開始來講解分析我的例子:

首先需要定義的就是輸入和輸出參數的格式,這裏簡單的創建了一個如下:

public class Result {
    private String result;

    public String getResult() {
        return result;
    }

    public void setResult(String result) {
        this.result = result;
    }
}
public class Task {
    private int id ;
    private String requestinfo;

    public Task(int id, String requestinfo) {
        this.id = id;
        this.requestinfo = requestinfo;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getRequestinfo() {
        return requestinfo;
    }

    public void setRequestinfo(String requestinfo) {
        this.requestinfo = requestinfo;
    }
}

好,定義完了輸入和輸出參數類型,現在開始定義數據類型Data接口:

public interface Data {
    Result getRequestinfo();
}


很簡單的一個接口,下面定義一個FutureData和RealData分別實現Data接口並處理


public class FutureData implements Data{

//    FutureData這個類只是一個裝飾,實際調用的還是RealData
    private RealData realData;
//    用來控制RealData是否賦值完
    private boolean isReady = false;

//    實現一個setRealData方法,用來賦值,並且實現線程間的通信
    public synchronized  void setRealData(RealData realData){
        if (isReady){
            return;
        }
        this.realData = realData;
        isReady=true;
        notify();
    }

//    實際調用的時RealData的方法,wait()是爲了等待賦值完成
    @Override
    public synchronized Result getRequestinfo() {
        while (!isReady){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return this.realData.getRequestinfo();
    }
}

public class RealData implements Data{

    Result result = new Result();

    public RealData(Task task){
        System.out.println("開始處理任務,請稍後");
        try {
//            模擬處理時間
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
//        這裏處理就是簡單的把參數內容傳進來,複雜處理可以進一步擴展
        result.setResultdata(task.getRequestinfo());
    }
    @Override
    public Result getRequestinfo() {
        return this.result;
    }
}


現在就需要提供一個對外部的接口可以來調用,我們設爲FutureClient

public class FutureClient {

//    注意這裏的參數需要爲final
    public Data request(final Task task){
        final FutureData futureData = new FutureData();

        new Thread(new Runnable() {
            @Override
            public void run() {
                RealData realData = new RealData(task);
                futureData.setRealData(realData);
            }
        }).start();
        return futureData;
    }
}

現在我們就可以在Main函數中調用了
public class Main {
    public static void main(String[] args) {
        Task task = new Task(1,"傳入參數");
        Data data = new FutureClient().request(task);
        System.out.println("參數已傳入");
        System.out.println("傳入參數爲:"+data.getRequestinfo().getResultdata());
    }
}

結果爲

到這裏我們整個Future模式就完成了,當然JDK底層也提供了Future,以後可以直接使用。




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