设计模式之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,以后可以直接使用。




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值