首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

研磨设计模式 之 备忘录方式(Memento)1——跟着cc学设计系列

2014-01-17 
研磨设计模式 之 备忘录模式(Memento)1——跟着cc学设计系列/**?* 模拟运行流程A,只是一个示意,代指某个具体

研磨设计模式 之 备忘录模式(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】

---------------------------------------------------------------------------

热点排行