19.1 场 景 问 题
19.1.1 开发仿真系统
考虑这样一个仿真应用,功能是,模拟运行针对某个具体问题的多个解决方案,记录运行过程的各种数据,在模拟运行完成以后,方便对这多个解决方案进行比较和评价,从而选定最优的解决方案。
这种仿真系统,在很多领域都有应用,比如工作流系统,对同一问题制定多个流程,然后通过仿真运行,最后来确定最优的流程作为解决方案;在工业设计和制造领域,仿真系统的应用就更广泛了。
由于都是解决同一个具体的问题,这多个解决方案并不是完全不一样的,假定它们的前半部分运行是完全一样的,只是在后半部分采用了不同的解决方案,后半部分需要使用前半部分运行所产生的数据。
由于要模拟运行多个解决方案,而且最后要根据运行结果来进行评价,这就意味着每个方案的后半部分的初始数据应该是一样的。也就是说在运行每个方案后半部分之前,要保证数据都是由前半部分运行所产生的数据。当然,这里并不具体地去深入到底有哪些解决方案,也不去深入到底有哪些状态数据,只是示意一下。
那么,这样的系统该如何实现呢?尤其是每个方案运行需要的初始数据应该一样,要如何来保证呢?
19.1.2 不用模式的解决方案
要保证初始数据的一致,实现思路也很简单:
(1)首先模拟运行流程第一个阶段,得到后阶段各个方案运行需要的数据,并把数据保存下来,以备后用。
(2)每次在模拟运行某一个方案之前,用保存的数据去重新设置模拟运行流程的对象,这样运行后面不同的方案时,对于这些方案,初始数据就是一样的了。
(1)根据上面的思路,写出仿真运行的示意代码。示例代码如下:
(2)看看如何使用这个模拟流程的对象,写个客户端来测试一下。示例代码如下:
运行结果如下:
仔细看上面结果中框住的部分,是一样的值,这说明,运行时它们的初始数据是一样的,基本满足了功能要求。
19.1.3 有何问题
看起来实现很简单,是吧,想一想有没有什么问题呢?
上面的实现有一个不太理想的地方,那就是数据是一个一个零散着在外部存放的,如果需要外部存放的数据多了,会显得很杂乱。这个容易解决,只需要定义一个数据对象来封装这些需要外部存放的数据就可以了。上面那样做是有意的,好提醒大家这个问题。这个就不再示例了。
还有一个严重的问题,那就是,为了把运行期间的数据放到外部存储起来,模拟流程的对象被迫把内部数据结构开放出来,这暴露了对象的实现细节,而且也破坏了对象的封装性。本来这些数据只是模拟流程的对象内部数据,应该是不对外的。