首页 > 其他分享 >备忘录模式

备忘录模式

时间:2023-12-18 10:36:40浏览次数:25  
标签:状态 对象 模式 content 备忘录 editor public

备忘录模式,也叫快照模式,它可以在不破坏封装性的前提下捕获一个对象的内部状态,并在对象之外保存这个状态,以便在需要的时候恢复到原先保存的状态。

常见的场景比如游戏进度日志,VMWare操作系统快照等,以备后续的恢复。

备忘录模式有三个角色,一是源发器,二是对源发器状态进行记录的备忘录,三是备忘录的管理者。

示例代码

/**
* @author Created by njy on 2023/7/1
* 1.备忘录(Memento):备忘录,保存编辑器的状态
* 定义:存储源发器对象的状态。备忘录对象可以包括一个或多个状态属性,源发器可以根据需要保存和恢复状态。
*/
public class EditorMemento {
//文本内容 (可以是属性、也可以是对象)
private String content;

public EditorMemento(String content) {
this.content = content;
}

public String getContent() {
return content;
}
}

/**
* @author Created by njy on 2023/7/1
* 2.源发器(Originator):文本编辑器
* 定义:需要保存和恢复状态的对象。它创建一个备忘录对象,用于存储当前对象的状态,也可以使用备忘录对象恢复自身的状态。
*/
public class Editor {
//内容(可以是属性、也可以是对象)
private String content;

public void setContent(String content) {
this.content = content;
}

public String getContent() {
return content;
}

// 创建备忘录对象,保存当前状态
public EditorMemento createMemento() {
return new EditorMemento(content);
}

// 恢复备忘录对象保存的状态
public void restoreMemento(EditorMemento memento) {
content = memento.getContent();
}

}

 

/**
* @author Created by njy on 2023/7/2
* 3.管理者(Caretaker):历史记录
* 定义:负责保存备忘录对象,但不能修改备忘录对象的内容。它可以存储多个备忘录对象,并决定何时将备忘录恢复给源发器。
*/
public class History {
//备忘录可以保存多个状态
private final List<EditorMemento> mementos = new ArrayList<>();

// 保存备忘录对象的状态
public void push(EditorMemento memento) {
mementos.add(memento);
}

// 弹出(移除)最近保存的备忘录对象,并返回它
public EditorMemento pop() {
int lastIndex = mementos.size() - 1;
EditorMemento lastMemento = mementos.get(lastIndex);
mementos.remove(lastIndex);
return lastMemento;
}

}

 

/**
* @author Created by njy on 2023/7/2
* 备忘录模式测试类
*/
@SpringBootTest
public class TestMemento {

@Test
void testMemento(){
//创建文本编辑器(源发器)
Editor editor = new Editor();
//创建管理者
History history = new History();
// 编辑文本并保存状态
editor.setContent("Hello");
history.push(editor.createMemento());

// 编辑更多文本并再次保存状态
editor.setContent("Hello, Java!");
history.push(editor.createMemento());

editor.setContent("Hello,world!");
System.out.println("当前内容: " + editor.getContent());

// 恢复之前的状态
editor.restoreMemento(history.pop());
System.out.println("恢复后上一次内容: " + editor.getContent());

editor.restoreMemento(history.pop());
System.out.println("恢复后上二次内容: " + editor.getContent());
}
}

标签:状态,对象,模式,content,备忘录,editor,public
From: https://www.cnblogs.com/seeksimple/p/17910461.html

相关文章

  • 仲裁者模式
    仲裁者模式和中介者模式类似,但作用又有不同之处,仲裁者模式是对多个对象的管理协调,而中介者一般是一代一。仲裁者有两个角色,仲裁者和被仲裁者,使用场景比如winform模式,form就是仲裁者,各种控件就是被仲裁者,仲裁者负责协调管理。代码示例packagedesignMode.mediator;publicinter......
  • 设计模式(十七)中介者
    一、定义义一个对象来封装一系列的对象交互。中介者模式使各对象不需要显示地相互引用,从而使其耦合松散,而且可以让你相对独立地改变它们之间的交互。中介者模式又称为调停模式,它是一种对象说行为型模式。二、描述在中介者模式中,引入了用于协调其他对象/类之间的相互调用的中介......
  • 行为设计模式-策略模式的优缺点
    策略模式的作用就是把具体的算法实现从业务逻辑中剥离出来,成为一系列独立的算法类,使得他们可以相互替换。举个例子:平常生活中超时基本上都有活动,比如会员日全场9折,周年庆消费多少减多少,抽奖活动等等。那么如果将业务具体落实在代码上,是不是可以用多个条件判断来封装具体的业务逻辑,i......
  • java状态模式
    1定义一个接口2publicinterfaceState{3publicvoidhandle();4}567/**8*具体的状态角色(下单)9*CreatedbyAdministrator10*/11publicclassPlaceAnOrderimplementsState{12//具体化状态的行为13@Override14publ......
  • 23种设计模式——模板模式
    今天我们来学习23种设计模式中的模板模式。模板模式需要注意抽象类与具体子类之间的协作。它用到了虚函数的多态性技术以及“不用调用我,让我来调用你”的反向控制技术。概念:模板模式是定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法......
  • 涉及到 List 集合的查询优化时,通常需要考虑集合的大小、查询的复杂度以及数据访问的模
    Java开发中,当涉及到List集合的查询优化时,通常需要考虑集合的大小、查询的复杂度以及数据访问的模式。以下是一些常见的优化技巧。使用StreamAPI进行并行查询StreamAPI可以很容易地并行化查询操作,这对于大规模数据集的查询非常有用。以下是一个并行查询的示例:importjava.ut......
  • Python实现软件设计模式4:建造者模式
    特点建造者模式是一步一步构建一个复杂的对象,属于对象创建型模式将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示关注如何逐步地创建一个复杂的对象或产品,不同的创造者定义了不同的创建过程用户不需要知道内部的具体构造细节、只用指定复杂对象的类......
  • Python实现软件设计模式3:抽象工厂模式
    特点系统中除了有多种产品类型(产品等级结构,如果汁、方便面、矿泉水),还出现了多个品牌(产品族,或农夫山泉、娃哈哈、康师傅、统一等品牌几乎都有这些产品)在工厂方法模式中,只有一个产品等级结构一个抽象产品(父类)、多个具体产品(子类)形成一个产品等级结构产品族是指由同一个工厂生产......
  • 设计模式概念和分类
    (设计模式概念和分类)概念设计模式一般是指软件开发人员在开发的时候遇到软件设计问题时的一般解决方案,这样当我们遇到重复问题的时候,就能够一次一次地使用该方案而避免了重复劳动。并且可以提高代码的可重用性和可读性,增强系统的可靠性和可维护性,解决一系列的复杂问题,提高协作效......
  • 结构性设计模式-适配器模式的优缺点
    把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法一起工作的两个类能够在一起工作。类的适配器模式对象的适配器模式对象适配器在上图中可以看出:冲突:Target期待调用Request方法,而Adaptee并没有(这就是所谓的不兼容了)。解决方案:为使Target能够使用Ad......