Java架构设计:状态机模式连接适配器调度复杂任务
假设现在系统架构中定义了一批状态机关键值,每一个状态机关键值对应一个任务的某些执行调度模块(函数),而这些执行调度模块又要执行相应的逻辑回调(接口)。设计目标:支持扩展和高度解耦。
现在以Java设计模式中的状态机模式为主体,各模块之间尽可能解耦,在用适配器把状态机关键值与任务的执行调度,已经相应的逻辑回调连接起来。
为此架构设计建立抽象模型:
状态机的状态值:
/**
* 状态机的状态值。
*
* @author fly
*
*/
public class State {
public final static String START = "start";
public final static String STOP = "stop";
}
一个任务的抽象模型,任务由各个生命周期组成,start()表示任务开始:
/**
* 任务的抽象。任务有不同的生命周期函数。
*
* @author fly
*
*/
public abstract class Task {
public abstract void start();
}
任何的调度、装配管理器:
import java.util.ArrayList;
/**
* 状态机的核心任务调度器抽象模型。
*
* @author fly
*
*/
public abstract class TaskController {
private Task task;
private String state;
private TaskLifecycle lifecycle;
private ArrayList<Adapter> adapters;
public TaskController(Task task) {
this.task = task;
this.adapters = new ArrayList();
}
public void setTask(Task task) {
this.task = task;
}
public Task getTask() {
return task;
}
public void execute() {
for (Adapter adapter : adapters) {
if (adapter.getState().equals(getState())) {
if (getTaskLifecycle() != null) {
adapter.callTaskLifecycle();
}
adapter.callTask();
}
}
}
public void setState(String state) {
this.state = state;
}
public String getState() {
return state;
}
public void setTaskLifecycle(TaskLifecycle lifecycle) {
this.lifecycle = lifecycle;
}
public TaskLifecycle getTaskLifecycle() {
return lifecycle;
}
public void addAdapter(Adapter adapter) {
this.adapters.add(adapter);
}
public ArrayList<Adapter> getAdapter() {
return adapters;
}
public void removeAdapter(Adapter adapter) {
for (Adapter a : adapters) {
if (a == adapter) {
adapters.remove(adapter);
break;
}
}
}
}
任何的生命周期回调,便于第三方开发者感知一个任务的生命周期变化,onStart()对应Task中的start():
/*
* 生命周期的回调函数抽象接口。
*
*/
public interface TaskLifecycle {
void onStart();
}
连接适配器,关键。此连接适配器负责把状态机状态值——Task的生命周期功能函数——任务的生命周期回调函数,这三者组装连接在一起,驱动这套系统架构的运转:
/**
* 连接适配器。该适配器把状态机的每一个状态值、生命周期函数、生命周期函数回调适配连接在一起。
*
* @author fly
*
*/
public interface Adapter {
String getState();
void callTask();
void callTaskLifecycle();
}
抽象模型的具体实例实现,以一个下载任务为例,一个下载任务的生命周期包含有开始(start)、停止(stop),其中stop函数为系统架构至少的扩展:
public class DownloadTask extends Task {
@Override
public void start() {
System.out.println("start");
}
// 假设父类中没有定义stop()函数,在这里扩展一个。
public void stop() {
System.out.println("stop");
}
}
下载任务的生命周期回调实例,第三方使用,其中onStop为体系架构之上的扩展:
public class DownloadTaskLifecycle implements TaskLifecycle {
@Override
public void onStart() {
System.out.println("onStart");
}
/**
* 抽象模型中没有onStop,在此新增一个,演示如何回调该函数。
*
*/
public void onStop() {
System.out.println("onStop");
}
}
下载任务的控制器:
public class DownloadTaskController extends TaskController {
public DownloadTaskController(Task task) {
super(task);
make();
}
private void make() {
DownloadTaskLifecycle lifecycle = new DownloadTaskLifecycle();
this.setTaskLifecycle(lifecycle);
// 连接适配器。
this.addAdapter(new Adapter() {
@Override
public String getState() {
return State.START;
}
@Override
public void callTaskLifecycle() {
if (getTaskLifecycle() != null) {
getTaskLifecycle().onStart();
}
}
@Override
public void callTask() {
getTask().start();
}
});
this.addAdapter(new Adapter() {
@Override
public String getState() {
return State.STOP;
}
@Override
public void callTaskLifecycle() {
if (getTaskLifecycle() != null) {
((DownloadTaskLifecycle) getTaskLifecycle()).onStop();
}
}
@Override
public void callTask() {
((DownloadTask) getTask()).stop();
}
});
}
}
测试例程:
/**
* 测试。以一个下载任务为例。 测试通过状态机控制器设置不同的状态值,调度执行不同的任务生命周期函数, 同时触发不同生命周期的回调函数。
*
* @author fly
*
*/
public class Main {
public static void main(String[] args) {
new Main().test();
}
private void test() {
Task task = new DownloadTask();
TaskController controller = new DownloadTaskController(task);
controller.setState(State.START);
controller.execute();
controller.setState(State.STOP);
controller.execute();
}
}
输出:
onStart
start
onStop
stop