iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0
自我挑戰組

設計模式系列 第 21

Day21 - 備忘錄模式(Memento pattern)

  • 分享至 

  • xImage
  •  

介紹
備忘錄模式將一物件的內部狀態備份起來,供後續恢復狀態時使用。

C++範例

#include <iostream>
#include <string>

class Memento;

class Object
{
public:
    Object(int value) : m_value(value)
    {
    }

    void IncrementInternalValue()
    {
        m_value++;
    }

    void PrintInternalValue() const
    {
        std::cout << "value in object: " + std::to_string(m_value) << std::endl;
    }

    Memento *CreateMemento() const;
    void ReinstateMemento(Memento *mem);

private:
    int m_value;
};

// 紀錄物件的類
class Memento
{
public:
    // 將給予的物件備份
    Memento(const Object &obj) : m_obj(obj) {}

    // 返回備份物件
    Object Snapshot() const
    {
        return m_obj;
    }

private:
    Object m_obj;
};

Memento *Object::CreateMemento() const
{
    return new Memento(*this);
}

void Object::ReinstateMemento(Memento *mem)
{
    *this = mem->Snapshot();
}

int main()
{
    // 建立一個內部狀態為1的物件
    Object object(1);

    // 印出內部狀態 (原始值)
    object.PrintInternalValue();

    // 紀錄object內部狀態到Memento
    Memento mem(object);

    // 改變object的內部狀態
    object.IncrementInternalValue();

    // 印出內部狀態 (改變後)
    object.PrintInternalValue();

    // 將object恢復到先前紀錄的狀態
    object = mem.Snapshot();

    // 印出內部狀態 (恢復後)
    object.PrintInternalValue();

    return 0;
}

Output:

value in object: 1
value in object: 2
value in object: 1

上一篇
Day20 - 迭代器模式(Iterator pattern)
下一篇
Day22 - 中介者模式(Mediator pattern)
系列文
設計模式30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言