研磨设计模式 之 备忘录模式(Memento)1——跟着cc学设计系列
/**
?* 模拟运行流程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】
---------------------------------------------------------------------------