通过上一篇博客 一步步学习 java并发编程模式之Active Object模式(四) 我们发现,增加一个类似的服务,天气服务的所有代码都需要重写,虽然这些代码很相似,但是仍然不能复用。这是因为我们违反了面向对象的DIP原则,没有对代码进行合适的抽象。设计其实就是抽象,将业务相关代码和业务无关代码解耦、复杂多变的细节和相对稳定的抽象解耦,彼此通过接口进行依赖。完全与业务无关代码,基本上不再需要我们编写,数据库连接池、AOP框架等这些每个应用都会遇到的问题,已经有很成熟的开源组件,我们直接使用即可。我们要做的就是对自己的产品业务进行抽象,形成高层次的、相对稳定的逻辑和流程,与具体的实现细节分离开。扯远了,回到正题,我们的目的就是对天气服务和距离服务进行抽象,形成框架。
jdk已经内置了对active Object模式的支持,我们看看怎么使用,这有助于我们设计和实现自己的active object框架
package activeobject.java;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class Test
{
public static void main(String[] args) throws Exception
{
ExecutorService threadPool = Executors.newSingleThreadExecutor();
Future<String> future = threadPool.submit(new WeatherTask());
System.out.println("I am running.");
System.out.println(future.get());
threadPool.shutdown();
}
}
class WeatherTask implements Callable<String>
{
@Override
public String call() throws Exception
{
Thread.sleep(5 * 1000);
return "气温:28;风向/风力:西北风 1级;湿度:74%";
}
}
可以看到,我们只需要编写真正的服务提供类,即WeatherTask,然后调用threadPool.submit()即可。可见JDK提供的Executor框架已经进行了良好的封装,使用起来很方便。