C++ 设计模式之备忘录模式

这篇具有很好参考价值的文章主要介绍了C++ 设计模式之备忘录模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【声明】本题目来源于卡码网(题目页面 (kamacoder.com))

【提示:如果不想看文字介绍,可以直接跳转到C++编码部分】


【设计模式大纲】

C++ 设计模式之备忘录模式,c++,备忘录模式,java,设计模式


【简介】

        -- 什么是备忘录模式 (第17种模式)

        备忘录模式(Memento Pattern)是⼀种⾏为型设计模式,它允许在不暴露对象实现的情况下捕获对象的内部状态并在对象之外保存这个状态,以便稍后可以将其还原到先前的状态。

C++ 设计模式之备忘录模式,c++,备忘录模式,java,设计模式


【基本结构】

        备忘录模式包括以下⼏个重要⻆⾊:

  • 发起⼈Originator : 需要还原状态的那个对象,负责创建⼀个【备忘录】,并使⽤备忘录记录当前时刻的内部状态。
  • 备忘录Memento : 存储发起⼈对象的内部状态,它可以包含发起⼈的部分或全部状态信息,但是对外部是不可⻅的,只有发起⼈能够访问备忘录对象的状态。

        备忘录有两个接⼝,发起⼈能够通过宽接⼝访问数据,管理者只能看到窄接⼝,并将备忘录传递给其他对象。

  • 管理者Caretaker : 负责存储备忘录对象,但并不了解其内部结构,管理者可以存储多个备忘录对象。
  • 客户端:在需要恢复状态时,客户端可以从管理者那⾥获取备忘录对象,并将其传递给发起⼈进⾏状态的恢复。

C++ 设计模式之备忘录模式,c++,备忘录模式,java,设计模式


【基本实现】

下面以Java代码作以简要说明:

1. 创建发起⼈类:可以创建备忘录对象

class Originator {
    private String state;
    public void setState(String state) {
        this.state = state;
    }
    public String getState() {
        return state;
    }
    // 创建备忘录对象
    public Memento createMemento() {
        return new Memento(state);
    }
    // 通过备忘录对象恢复状态
    public void restoreFromMemento(Memento memento) {
        state = memento.getState();
    }
}

2. 创建备忘录类:保存发起⼈对象的状态

class Memento {
    private String state;
    // 保存发起⼈的状态
    public Memento(String state) {
        this.state = state;
    }
    public String getState() {
        return state;
    }
}

3. 创建管理者:维护⼀组备忘录对象

class Caretaker {
    private List<Memento> mementos = new ArrayList<>();
    public void addMemento(Memento memento) {
        mementos.add(memento);
    }
    public Memento getMemento(int index) {
        return mementos.get(index);
    }
}

4. 客户端使用备忘录模式

/**
* @version Copyright (c) 2024 NCDC, Servo。 Unpublished - All rights reserved
* @file MementoMode.hpp
* @brief 备忘录模式
* @autor 写代码的小恐龙er
* @date 2024/01/19
*/
public class Main {
    public static void main(String[] args) {
    // 创建发起⼈对象
    Originator originator = new Originator();
    originator.setState("State 1");

    // 创建管理者对象
    Caretaker caretaker = new Caretaker();

    // 保存当前状态
    caretaker.addMemento(originator.createMemento());

    // 修改状态
    originator.setState("State 2");

    // 再次保存当前状态
    caretaker.addMemento(originator.createMemento());

    // 恢复到先前状态
    originator.restoreFromMemento(caretaker.getMemento(0));
    System.out.println("Current State: " + originator.getState());
    }
}

【使用场景】

        备忘录模式在保证了对象内部状态的封装和私有性前提下可以轻松地添加新的备忘录和发起⼈,实现“备份”,不过备份对象往往会消耗较多的内存,资源消耗增加。

        备忘录模式常常⽤来实现撤销和重做功能,⽐如在Java Swing GUI编程中,javax.swing.undo 包中的撤销(undo)和重做(redo)机制使⽤了备忘录模式。UndoManager 和UndoableEdit 接⼝是与备忘录模式相关的主要类和接⼝。


【C++编码部分】

1. 题目描述

        小明正在设计一个简单的计数器应用,支持增加(Increment)和减少(Decrement)操作,以及撤销(Undo)和重做(Redo)操作,请你使用备忘录模式帮他实现。

2. 输入描述

        输入包含若干行,每行包含一个字符串,表示计数器应用的操作,操作包括 "Increment"、 "Decrement"、"Undo" 和 "Redo"。

3. 输出描述

        对于每个 "Increment" 和 "Decrement" 操作,输出当前计数器的值,计数器数值从0开始 对于每个 "Undo" 操作,输出撤销后的计数器值。 对于每个 "Redo" 操作,输出重做后的计数器值。

4. C++编码实例

/**
* @version Copyright (c) 2024 NCDC, Servo。 Unpublished - All rights reserved
* @file MementoMode.hpp
* @brief 备忘录模式
* @autor 写代码的小恐龙er
* @date 2024/01/19
*/

#include <iostream>
#include <string>
#include <vector>
#include <stack>

using namespace std;

// 前置声明

// 备忘录类 -- 保存发起⼈对象的状态
class Memento;
// 发起人类 -- 可以创建备忘录对象
class Counter;
// 管理者 -- 一组备忘录对象
class MementoManager;

// 类的定义

// 备忘录类
class Memento
{
// 成员数据
private:
    int _value;

// 备忘录操作的成员函数
public:
    Memento(int value){
        SetValue(value);
    }
    void SetValue(int value){
        this->_value = value;
    }
    int GetValue(){
        return this->_value;
    }
};

// 发起人 类
class Counter
{
// 成员数据
private:
    int _value;//  发起人的计数值
    std::stack<Memento *> _undoStack; // 发起人撤销操作的栈 
    std::stack<Memento *> _redoStack; // 发起人重新操作的栈
    
// 成员函数 
public:
    Counter(){}
    // 获取值
    int GetValue(){
        return this->_value;
    }
    // 增加计数值
    void IncreaseValue(Memento *memento){
        //清空重做的栈
        while(!_redoStack.empty()){
            _redoStack.pop();
        }
        _undoStack.push(memento);
        _value++;
    }
    // 减少计数值
    void DecreaseValue(Memento *memento){
        //清空重做的栈
        while(!_redoStack.empty()){
            _redoStack.pop();
        }
        _undoStack.push(memento);
        _value--;
    }
    // 撤销操作
    void Undo(Memento *memento){
        if(!_undoStack.empty()){
            _redoStack.push(memento);
            _value = _undoStack.top()->GetValue();
        }
    }
    // 重新操作
    void Redo(Memento *memento){
        if(!_redoStack.empty()){
            _undoStack.push(memento);
            _value = _redoStack.top()->GetValue();
        }
    }
};

// 管理者 
class MementoManager
{
// 成员数据
private:
    std::vector<Memento *> _mementoVec;

// 成员函数
public:
    // 增加备忘录
    void AddMemento(Memento *mento){
        _mementoVec.push_back(mento);
    }
    // 寻找备忘录 按照顺序 或者 备忘录中的计数值
    Memento * GetMemento(int index){
        if(index >= _mementoVec.size()) return nullptr;
        else return _mementoVec[index];
    }
};

// 客户端
int main()
{
    // 操作类型
    string type = "";
    // 新建 发起人 类 
    Counter *counter = new Counter();
    // 新建备忘录管理者
    MementoManager *manager = new MementoManager();
    // 新建备忘录
    Memento *memento = nullptr;
    // 等待输入指令
    while(std::cin >> type){
        if(type == "Increment"){
            memento = new Memento(counter->GetValue());
            counter->IncreaseValue(memento);
        }
        else if(type == "Decrement"){
            memento = new Memento(counter->GetValue());
            counter->DecreaseValue(memento);
        }
        else if(type == "Undo"){
            memento = new Memento(counter->GetValue());
            counter->Undo(memento);
        }
        else if(type == "Redo"){
            memento = new Memento(counter->GetValue());
            counter->Redo(memento);
        }

        // 将备忘录添加至管理者中 【此时备忘录管理者可以去做其他的事情】
        manager->AddMemento(memento);
        
        // 输出计数器的值
        std::cout<< counter->GetValue() << endl;
    }
    
    
    // 析构
    if(memento != nullptr){
        delete memento;
        memento = nullptr;
    }
    
    delete counter;
    counter = nullptr;
    delete manager;
    manager = nullptr;
    
    return 0;
}




......

To be continued.文章来源地址https://www.toymoban.com/news/detail-809162.html

到了这里,关于C++ 设计模式之备忘录模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java设计模式之行为型-备忘录模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 五、总结  备忘录模式是一种行为型设计模式,它允许保存一个对象的内部状态到一个备忘录对象中,这样就可以在需要的时候恢复这个对象的状态了,同时又不违反封装性原则。 这个模式的核心就是备忘录对象,

    2024年02月16日
    浏览(30)
  • 【设计模式——学习笔记】23种设计模式——备忘录模式Memento(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当大战Boss后攻击力和防御力下降,可以从备忘录对象恢复到大战前的状态 针对每一种角色,设计一个类来存储该角色的状态 【分析】 一个对象,就对应一个保存对象状态的对象, 这样当我们游戏

    2024年02月13日
    浏览(41)
  • 【设计模式】备忘录模式

    主页传送门: 💁 传送        备忘录(Memento Pattern)模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式。。其定义如下: Without violating encapsulation,capture and externalize an object’s internal state so that the object can be restored to this state later.        即:在不破坏封

    2024年02月07日
    浏览(38)
  • 设计模式-备忘录模式

    备忘录模式(Memento Pattern)是计算机科学中的一种行为设计模式。它提供了一种在不破坏封装性的前提下,捕获和恢复对象内部状态的方法。这种模式主要用于在用户需要回滚到对象的某个先前状态时,能够实现状态的还原。 在备忘录模式中,主要涉及到三个角色: Origina

    2024年01月23日
    浏览(37)
  • 设计模式——备忘录模式

    备忘录模式(Memento Pattern)是一种行为型设计模式,它在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样可以在需要时将对象恢复到先前的状态。 发起人(Originator): 是拥有复杂内部状态的对象,它可以创建和恢复备忘录。 备忘录(M

    2024年01月19日
    浏览(31)
  • 《设计模式》备忘录模式

    定义 : 备忘录模式又称为快照模式或者令牌模式, 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。 属性 行为型 模式。 备忘录模式的角色组成 : Originator(发起人) :负责创建一个 Memento

    2024年02月06日
    浏览(36)
  • 【备忘录设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    备忘录模式(Memento Pattern)是一种结构型设计模式。这种模式就是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并放在外部存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。备忘录模式常常与命令模式和迭代子模式一同使用。 备忘录模式

    2023年04月20日
    浏览(56)
  • 【前端设计模式】之备忘录模式

    设计模式是在软件开发中经过验证的解决问题的方法。它们是从经验中总结出来的,可以帮助我们更好地组织和管理代码,提高代码的可维护性、可扩展性和可重用性。无论是前端还是后端开发,设计模式都扮演着重要的角色。在本专栏中,我们将探索一些常见的前端设计模

    2024年02月05日
    浏览(32)
  • 设计模式行为型——备忘录模式

    目录 备忘录模式的定义 备忘录模式的实现 备忘录模式角色 备忘录模式类图 备忘录模式举例 备忘录模式代码实现 备忘录模式的特点 优点 缺点 使用场景 注意事项 实际应用         备忘录模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Token模式(Token Pattern),属

    2024年02月14日
    浏览(45)
  • 设计模式(十八)备忘录

    在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样就可以在以后将对象恢复到原先保存的状态。备忘录模式是一种对象行为型模式,其别名为标记(Token)模式。 备忘录模式的核心在于备忘录类以及用于管理备忘录的负责人类的设计,包

    2024年02月04日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包