主要参与者:
Main: 系统启动,调用Client发出的请求
Client : 返回数据对象 ,立即返回FutureData,并开启ClientThread线程装备RealData
Data: 返回数据的接口
FutureData: Future 数据,构造很快,但是是一个虚拟的 数据,需要装备RealData
RealData:真是数据,其构造比较复杂,费时
简单的Future模式代码实现:
Main调用
public class Main {
public static void main(String[] args) {
Client client = new Client();
Data data = client.request("haha");//这里会立即返回,因为得到的是FutureData 而不是RealData
System.out.println("请求完毕");
try {
// 这里相当于其他业务操作,可能很费时
Thread.sleep(10000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(“数据-->”+data.getResult());//真实的数据
}
}
Client的实现 获取FutureData 开启构造RealData的线程 并很快返回FutureData:
public class Client {
public Data request(final String queryStr){
final FutureData future = new FutureData();
new Thread(){
public void run() {
//RealData的构建很慢
//要在单独的线程中执行
RealData realData = new RealData(queryStr);//构建RealData
future.setRealDate(realData);//将RealData装配到FutureData中
}
}.start();
return future;//FutureData会被立即返回
}
}
Data接口的实现 RealData和FutureData都要实现这个接口
public interface Data {
public String getResult();
}
FutureData的实现:是Future模式的关键,是RealData的代理,封装了获取RealData的等待过程
public class FutureData implements Data{
protected RealData realdata = null; //FutureData是RealData的包装
protected boolean isReady =false;
public synchronized void setRealDate(RealData realdata){
if(isReady){
return;
}
this.realdata=realdata;
isReady=true;
notifyAll(); //RealData已经被注入,通知getResult()
}
@Override
public synchronized String getResult() {//会等待RealData构造完成
while(!isReady){
try {
wait(); //一直等待,等到setRealData 来通知 注入完成
}catch (Exception e) {
e.printStackTrace();
}
}
return realdata.result; //由RealData实现,返回RealData的result字段
}
}
RealData的实现: 使用数据模型,构造会很慢或者业务处理比较慢
public class RealData implements Data{
protected final String result;
public RealData(String para){//构造会很慢 用sleep来模拟
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 10; i++) {//代替构造过程
sb.append(para);
try{
Thread.sleep(100);
}catch(Exception e){
e.printStackTrace();
}
}
result = sb.toString();
}
@Override
public String getResult() {
return result;
}
}
简单的Future模式到此为止