19.1 场景问题
19.1.1 开发仿真系统
考虑这样一个仿真应用,功能是:模拟运行针对某个具体问题的多个解决方案,记录运行过程的各种数据,在模拟运行完成过后,好对这多个解决方案进行比较和评价,从而选定最优的解决方案。
这种仿真系统,在很多领域都有应用,比如:工作流系统,对同一问题制定多个流程,然后通过仿真运行,最后来确定最优的流程做为解决方案;在工业设计和制造领域,仿真系统的应用就更广泛了。
由于都是解决同一个具体的问题,这多个解决方案并不是完全不一样的,假定它们的前半部分运行是完全一样的,只是在后半部分采用了不同的解决方案,后半部分需要使用前半部分运行所产生的数据。
由于要模拟运行多个解决方案,而且最后要根据运行结果来进行评价,这就意味着每个方案的后半部分的初始数据应该是一样,也就是说在运行每个方案后半部分之前,要保证数据都是由前半部分运行所产生的数据,当然,咱们这里并不具体的去深入到底有哪些解决方案,也不去深入到底有哪些状态数据,这里只是示意一下。
那么,这样的系统该如何实现呢?尤其是每个方案运行需要的初始数据应该一样,要如何来保证呢?
19.1.2 不用模式的解决方案
要保证初始数据的一致,实现思路也很简单:
- 首先模拟运行流程第一个阶段,得到后阶段各个方案运行需要的数据,并把数据保存下来,以备后用
- 每次在模拟运行某一个方案之前,用保存的数据去重新设置模拟运行流程的对象,这样运行后面不同的方案时,对于这些方案,初始数据就是一样的了
根据上面的思路,来写出仿真运行的示意代码,示例代码如下:
/** * 模拟运行流程A,只是一个示意,代指某个具体流程 */ public class FlowAMock { /** * 流程名称,不需要外部存储的状态数据 */ private String flowName; /** * 示意,代指某个中间结果,需要外部存储的状态数据 */ private int tempResult; /** * 示意,代指某个中间结果,需要外部存储的状态数据 */ private String tempState; /** * 构造方法,传入流程名称 * @param flowName 流程名称 */ public FlowAMock(String flowName){ this.flowName = flowName; }
public String getTempState() { return tempState; } public void setTempState(String tempState) { this.tempState = tempState; } public int getTempResult() { return tempResult; } public void setTempResult(int tempResult) { this.tempResult = tempResult; }
/** * 示意,运行流程的第一个阶段 */ public void runPhaseOne(){ //在这个阶段,可能产生了中间结果,示意一下 tempResult = 3; tempState = "PhaseOne"; } /** * 示意,按照方案一来运行流程后半部分 */ public void schema1(){ //示意,需要使用第一个阶段产生的数据 this.tempState += ",Schema1"; System.out.println(this.tempState + " : now run "+tempResult); this.tempResult += 11; } /** * 示意,按照方案二来运行流程后半部分 */ public void schema2(){ //示意,需要使用第一个阶段产生的数据 this.tempState += ",Schema2"; System.out.println(this.tempState + " : now run "+tempResult); this.tempResult += 22; } } |
(2)看看如何使用这个模拟流程的对象,写个客户端来测试一下。示例代码如下:
public class Client { public static void main(String[] args) { // 创建模拟运行流程的对象 FlowAMock mock = new FlowAMock("TestFlow"); //运行流程的第一个阶段 mock.runPhaseOne(); //得到第一个阶段运行所产生的数据,后面要用 int tempResult = mock.getTempResult(); String tempState = mock.getTempState();
//按照方案一来运行流程后半部分 mock.schema1();
//把第一个阶段运行所产生的数据重新设置回去 mock.setTempResult(tempResult); mock.setTempState(tempState);
//按照方案二来运行流程后半部分 mock.schema2(); } } |
运行结果如下:
PhaseOne,Schema1 : now run 3 PhaseOne,Schema2 : now run 3 |
仔细看,上面结果中框住的部分,是一样的值,这说明运行时,它们的初始数据是一样的,基本满足了功能要求。
19.1.3 有何问题
看起来实现很简单,是吧,想一想有没有什么问题呢?
上面的实现有一个不太好的地方,那就是数据是一个一个零散着在外部存放的,如果需要外部存放的数据多了,会显得很杂乱。这个好解决,只需要定义一个数据对象来封装这些需要外部存放的数据就可以了,上面那样做是故意的,好提醒大家这个问题。这个就不去示例了。
还有一个严重的问题,那就是:为了把运行期间的数据放到外部存储起来,模拟流程的对象被迫把内部数据结构开放出来,这暴露了对象的实现细节,而且也破坏了对象的封装性。本来这些数据只是模拟流程的对象内部数据,应该是不对外的。
那么究竟如何实现这样的功能会比较好呢?
---------------------------------------------------------------------------
私塾在线学习网原创内容 跟着cc学设计系列 之 研磨设计模式
原创内容,转载请注明出处【http://sishuok.com/forum/blogPost/list/0/5632.html】
---------------------------------------------------------------------------
相关推荐
备忘录模式(Memento) 用意:用来存储另一对象内部状态的快照。
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。
NULL 博文链接:https://edwin492.iteye.com/blog/1124741
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。 备忘录模式java demo
第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第...
C#面向对象设计模式纵横谈(21):(行为型模式) Memento 备忘录模式
主要介绍了Java设计模式之备忘录模式(Memento模式)介绍,memento是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到原先保存的状态,需要的朋友可以参考下
主要为大家详细介绍了C++设计模式之备忘录模式Memento的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例讲述了Python设计模式之备忘录模式原理与用法。分享给大家供大家参考,具体如下: 备忘录模式(Memento Pattern):不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,这样已经后就可将...
第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第...
为了使软件的使用更加人性化,对于误操作,我们需要提供一种类似“后悔药”的机制,让软件系统可以回到误操作前的状态,因此需要保存用户每一次操作时系统的状态,一旦...备忘录模式是一种给我们的软件提供后悔药的机制
备忘录模式C++实现,若理解有误,请留言指出。
C#面向对象设计模式 (行为型模式) Memento 备忘录模式 视频讲座下载
备忘录模式( Memento Pattern)在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。备忘录模式属于行为型模式。 通俗的讲,备忘录故名思意...
这是运用Memento设计模式,设计的一个简单实例, 你可以通过工具栏选择绘制不同图形,使用备份创建备忘录,然后选择恢复进行绘制图形的恢复。 http://blog.csdn.net/ziyuanxiazai123/article/details/12421265
C++设计模式课件19_Memento_备忘录.pdfC++设计模式课件19_Memento_备忘录.pdf
备忘录模式的示例代码和文档,学习备忘录模式的参考资料。
在备忘录模式里,一个备忘录是一个对象,它存储另一个对象(备忘录的原发器)在某个瞬间的内部状态。备忘的目的就是为了以后在需要的时候,可以将原发器对象的状态恢复(undo/rollback)到备忘录所保存的状态。 备忘...