文档章节

设计模式16——Memento设计模式

小米米儿小
 小米米儿小
发布于 2014/01/24 15:02
字数 306
阅读 101
收藏 7

Memento备忘录设计模式是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到以前保存的状态。Memento备忘录设计模式的结构如下:

Memento备忘录设计模式有以下3个重要角色:

Originator:需要保存内部状态的对象。

Caretaker:为Originator保存并恢复状态的对象。

Memento:存放Originator内部状态的对象,由Originator进行读写,并且Caretaker进行维护。

Memento备忘录设计模式例子代码如下:

// Memento
class Memento{
    private String state;
    public Memento(String state){
        this.state = state;
    }

    public String getState(){
        return state;
    }
}


// Caretaker
class Caretaker{
    private Stack<Memento> mementos = new Stack<Memento>();
    public void addMemento(Memento m){
        mementos.push(m);
    }

    public Memento getMemento(){
        if(!mementos.empty()){
            return mementos.pop();
        }
        return null;
    }
}


// Originator
public class Originator{
    private String state;
    public Originator(String state){
        this.state = state;
    }

    public void setState(){
        this.state = state;
    }

    public String getState(){
        return state;	
    }

    public Memento createMemento(String state){
        return new Memento(state);
    }

    public static void main(String[] args){
        Originator originator = new Originator(“State1”);
        Caretaker caretaker = new Caretaker();
        caretaker.addMemento(originator. createMemento(originator.getState()));
        originator.setState(“State2”);
        String restore = caretaker. getMemento().getState();
        System.out.println(“Current originator state=” + originator.getState() + “,restore state=” + restore);
    }
}


程序运行结果:

Currentoriginator state= State2,restore state= State1

Memento备忘录设计模式常用于文字编辑软件/IDE集成开发环境中的撤销和恢复操作。

本文转载自:http://blog.csdn.net/chjttony/article/details/7505664

小米米儿小
粉丝 42
博文 114
码字总数 83921
作品 0
成都
程序员
私信 提问
《JavaScript设计模式与开发实践》原则篇(2)—— 最少知识原则

最少知识原则(LKP)说的是一个软件实体应当尽可能少地与其他实体发生相互作用。这 里的软件实体是一个广义的概念,不仅包括对象,还包括系统、类、模块、函数、变量等。 单一职责原则指导我们...

嗨呀豆豆呢
2018/12/30
0
0
(目录)设计模式(可复用面向对象软件的基础)

本系列“设计模式”博客使用Golang语言实现算法。所谓算法是指解决一个问题的步骤,个人觉得不在于语言。小弟只是最近学习Golang,所以顺带熟练一下语法知识,别无它意。 本系列博客主要介绍...

chapin
2015/01/13
158
0
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.5K
69
《JavaScript设计模式与开发实践》最全知识点汇总大全

系列文章: 《JavaScript设计模式与开发实践》基础篇(1)—— this、call 和 apply 《JavaScript设计模式与开发实践》基础篇(2)—— 闭包和高阶函数 《JavaScript设计模式与开发实践》模式...

嗨呀豆豆呢
01/04
0
0
EasyToLearnDesignPattern

简单上手设计模式 GITHUB:https://github.com/Fisher-Joe/EasyToLearnDesignPattern 本文旨在使用最简单的语言,最简单的代码让人学习设计模式(最起码是我) 说明: 本文的所有内容都是基于...

芝麻开门
04/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JS其他类型值转化为Boolean类型规则

本文转载于:专业的前端网站➤JS其他类型值转化为Boolean类型规则 由于最近在笔试的时候,发现好多关于其他类型转化为Boolean类型的题目,因此总结一下! 一、String类型转化为Boolean 1.转化...

前端老手
10分钟前
2
0
EurekaClient自动装配及启动流程解析

在上篇文章中,我们简单介绍了EurekaServer自动装配及启动流程解析,本篇文章则继续研究EurekaClient的相关代码 老规矩,先看spring.factories文件,其中引入了一个配置类EurekaDiscoveryClie...

Java学习录
16分钟前
2
0
析构函数是否必须为虚函数?为何?

在C++中,基类指针可以指向一个派生类的对象。如果基类的析构函数不是虚函数,当需要delete这个指向派生类的基类指针时,就只会调用基类的析构函数,而派生类的析构函数无法被调用。容易造成...

天王盖地虎626
17分钟前
2
0
【TencentOS tiny】深度源码分析(7)——事件

引言 大家在裸机编程中很可能经常用到flag这种变量,用来标志一下某个事件的发生,然后在循环中判断这些标志是否发生,如果是等待多个事件的话,还可能会if((xxx_flag)&&(xxx_flag))这样子做...

杰杰1号
20分钟前
2
0
聊聊nacos client的ServerHttpAgent

序 本文主要研究一下nacos client的ServerHttpAgent HttpAgent nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/http/HttpAgent.java public interface HttpAgent { ......

go4it
26分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部