//备忘录模式定义:
//在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
//这样以后就能够将该对象恢复到原先保存的状态
//实例:測试两种方案。两种方案在第一阶段的过程是同样的,第二阶段是不同的
//实例代码
//备忘录对象的窄接口
public interface FlowAMockMemento {
//空的,所谓窄接口,即仅仅是一个标识作用,它的持有者不能够调用不论什么它的方法
}
//測试流程类
public class FlowAMock {
private String flowName;
private int tempResult;
private String tempState;
public FlowAMock(String flowName) {
this.flowName = flowName;
}
public void runPhaseOne() {
tempResult = 3;
tempState = "PhaseOne";
}
public void shema1() {
this.tempState += ",Schema1";
System.out.pritnln(this.tempState+":now run"+tempResult);
this.tempResult += 11;
}
public void schema2() {
this.tempState += ",Schema2";
System.out.pritnln(this.tempState+":now run"+tempResult);
this.tempResult += 22;
}
public FlowAMockMemento createMemento() {
return new MementoImpl(this.tempResult, this.tempState);
}
public void setMemento(FlowAMockMemento memento) {
MementoImpl mementoImpl = (MementoImpl)memento;
this.tempResult = mementoImpl.getTempResult();
this.tempState = mementoImpl.getTempState();
}
private static class MemetoImpl implements FlowAMockMemento {
private int tempResult;
private String tempState;
public MemetoImpl(int tempResult, String tempState) {
this.tempResult = tempResult;
this.tempState = tempState;
}
public int getTempResult() {
return tempResult;
}
public int getTempState() {
return tempState;
}
}
}
//备忘录管理类
public class FlowAMementoCareTaker {
private FlowAMockMemento memento = null;
public void saveMemento(FlowAMockMemento memento) {
this.memento = memento;
}
public FlowAMockMemento retriveMemento() {
return this.memento;
}
}
//client
public class Client {
public static void main(String[] args) {
FlowAMock mock = new FlowAMock("TestFlow");
mock.runPhaseOne();
FlowAMementoCareTaker careTaker = new FlowAMementoCareTaker();
FlowAMockMemento memento = mock.createMemento();
careTaker.saveMemento(memento);
mock.schema1();//执行第一种方案
mock.setMemento(careTaker.retriveMemento());//恢复数据
mock.schema2();//执行另外一种发难
}
}
//备忘录模式本质:保存和恢复内部状态
//长处:更好的封装性。因为使用了内部类和窄接口,所以外部就算持有备忘录接口对象也无法訪问当中的属性
//备忘录模式中内部内和窄接口是最给力的设计,这样给把对象的接口给外部保存
//可是接口中没有方法,所以外部无法访问。充分保证了封装
//只需要创建它的主要技能是其价值和获得足够的

版权声明:本文博客原创文章,博客,未经同意,不得转载。

备忘录模式设计模式入门Memento的更多相关文章

  1. 折腾Java设计模式之备忘录模式

    原文地址:折腾Java设计模式之备忘录模式 备忘录模式 Without violating encapsulation, capture and externalize an object's int ...

  2. [工作中的设计模式]备忘录模式memento

    一.模式解析 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并外部化,存储起来,从而可以在将来合适的时候把 ...

  3. 深入浅出设计模式——备忘录模式(Memento Pattern)

    模式动机 为了使软件的使用更加人性化,对于误操作,我们需要提供一种类似“后悔药”的机制,让软件系统可以回到误操作前的状态,因此需要保存用户每一次操作时系统的状态,一旦出现误操作,可以把存储的历史状态取 ...

  4. [设计模式] 18 备忘录模式Memento Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对备忘录模式是这样说的:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存 ...

  5. 我所理解的设计模式(C++实现)——备忘录模式(Memento Pattern)

    概述: 我们玩单机游戏的时候总会遇到老婆大人的各位事情,一会去买瓶醋了,一会去打个酱油了,会耽误我们玩游戏的进程,但是此时我们能有“保存游戏”这个宝贝,我们的主基地不会在我们打酱油的时候被对手拆掉. ...

  6. 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern)

    原文:乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) 作者:webabc ...

  7. 设计模式20---设计模式之备忘录模式(Memento)(行为型)

    1.讲解备忘录模式 备忘录模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式. 1.1定义 在不破坏封 ...

  8. 【Unity与23种设计模式】备忘录模式(Memento)

    GoF中定义: "在不违反封装的原则下,获取一个对象的内部状态并保留在外部,让对象可以在日后恢复到原先保留时的状态." 对于一些需要存储的数据,比如历史最高分 当与得分减分系统写入 ...

  9. 备忘录模式 Memento 快照模式 标记Token模式 行为型 设计模式(二十二)

    备忘录模式 Memento   沿着脚印,走过你来时的路,回到原点.     苦海翻起爱恨   在世间难逃避命运   相亲竟不可接近   或我应该相信是缘份   一首<一生所爱>触动了多少 ...

随机推荐

  1. Drupal 7 模 .info 文件描述

    Drupal使用.info文件以节省话题(theme)和模块(modules)基本数据(metadata). 编码:推荐使用UTF-8.这是一个没有BOM(Byte Order Mark). 下面是一 ...

  2. 执行Sql块

    import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import oracle.C ...

  3. javascript获取当前url中的參数

    javascript获取当前页面url中的參数能够使用location的search方法,获取到的是url中?后面的部分,比如http:localhost:8080/Manager/index.jsp ...

  4. IOS设计模式学习(21)享元

    1 前言 在面向对象软件设计中,利用公共对象不仅能节省资源还能提高性能.共享的对象只能提供某些内在的信息,而不能用来识别对象.专门用于设计可共享对象的一种设计模式叫做享元模式(Flyweight pa ...

  5. 修改系统启动项 grub2配置的方法 ubuntu[转]

    在 早期的Ubuntu中,使用Grub作为系统的启动引导程序,想修改系统启动项非常简单,只要用gedit打开系统菜单设定文件( sudo gedit /boot/grub/menu.lst ),修改该 ...

  6. MVC快速分页

    .NET手记-ASP.NET MVC快速分页的实现   对于Web应用,展示List是很常见的需求,随之而来的常见的分页组件.jQuery有现成的分页组件,网上也有着大量的第三方分页组件,都能够快速实 ...

  7. 机械革命X5(MECHREVO MR-X5)开包检验

    不废话.直接的问题,左右X5没有更具体的信息.为了通过有机会了解后续的选择,具体的数据被释放约: 首先看包装: 1.快递包裹,基于卖方这可以是不同的,包装各不相同 watermark/2/text/a ...

  8. windows下搭建Apache+Mysql+PHP开发环境

    原文:windows下搭建Apache+Mysql+PHP开发环境 要求 必备知识 熟悉基本编程环境搭建. 运行环境 windows 7(64位); Apache2.2;MySQL Server 5. ...

  9. How to install PL/SQL developer on linux (转)

    PL/SQL developer 在linux上的安装方法工欲善其事必先利其器,PL/SQL和toad对于ORACLE从业人员来说都是很重要的工具,但这些工具都没有linux的发行版,如果要在linu ...

  10. Android-管理Activity生命周期 -开始一个Activity

    很多程序都是从main()方法开始启动的,和其他程序不同,android是在activity生命周期的特定状态的特定回调方法中初始化代码的.activity启动和销毁的时候都用很多回调方法. 这里将要 ...