(三) 流程的COMPOSITE模式
10086流程的基本过程:播放语音、播放语音取按键、根据按键执行特定的操作。
因此,可以定义流程的每一个基本操做为一个
STATE模式,流程是由这些
STATE组成,
即流程可以分解成一些基本
STATE的集合。
流程与用户之间有很多的交互,与用户的交互结果决定了流程的下一个动作。但是同时使用流程的用户是很多。因此对用户请求的处理是多线程的:
(1) 一个用户一个线程(缺点:一个用户一个线程,流程是要花费代价去创建线程,如果同时使用的用户很多,那么创建的线程也多)。
(2) 线程池,程序创建一个线程池,对于用户的请求进行任务分派。
一般的解决方式是采用方法(2),流程与用户的交互是异步的。
STATE的转变是基于事件的,而不是简单的遍历。
在实现的过程中,播放语音是一个基本的操作,播放语音取按键也是一个基本的操作,与用户的交互后,执行特定的操作,每个这样的操作也是基本的操作,但是取按键后的操作可以是一个简单的操作(
Leaf),可以是一个复合的操作(
COMPOSITE)。
以下是简要的实现思路:
1:流程是由一序列的
STATE组成。
2:
STATE 可以分为简单的
Leaf、复杂的
COMPOSITE,
COMPOSITE是组合那些没有用户交互的
STATE,采用
COMPOSITE是为了提高代码的复用率。为了
STATE 的共用性,
STATE与对象的状态通过
MEMENTO传递。每个状态执行后将保存该次执行后的
MEMENTO。
3:流程里面的有些操作有跳转到上一级目录的操作,也就是说在
STATE 中得有获取上一级目录的方法。由于状态与用户是有交互,因此允许用户在交互的时候有一定的错误数次,在用户错误的交互后,该状态必须回滚到前一状态,每个状态也必须知道它的直接的后继状态。
4:
STATE对象与其成员函数的运行状态通过
MEMENTO解耦。因此在程序中对于公用的
STATE对象用一个整型
ID标志。
5:
MEMENTO保存
STATE对象必需的对象信息,有些
STATE对象不能很明确知道自己的上一级目录,或是它的上一个状态,而这些必需通过
MEMENTO 获取。
以下是简要的设计结构图:
DEMO等比较空闲的时候,再提供!
谢谢大家的阅读,欢迎提出修改的建议。