1. 程式人生 > >23種設計模式之(十九)備忘錄模式(python_c++實現) .md

23種設計模式之(十九)備忘錄模式(python_c++實現) .md

23種設計模式之(十九)備忘錄模式(Memento)

本文主要介紹23種設計模式之備忘錄模式,附詳細python/c++示例程式碼。

  • 概念
  • 應用場景
  • 注意事項
  • 程式碼示例
  • 總結
  • 程式碼連結

備忘錄模式(Memento)

概念

備忘錄模式,是行為模式之一,它的作用是儲存物件的內部狀態,並在需要的時候(undo/rollback)恢復物件以前的狀態。

GoF對備忘錄模式的定義是:在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到儲存的狀態。

應用場景

(1)、 需要儲存/恢復資料的相關狀態場景。 (2)、 提供一個可回滾的操作。物件之間的耦合度。

C++程式碼示例

/************************************************************************/
/* 設計模式專題
/*
/* 備忘錄模式
/*
/* Author  : zzl
/*
/* 程式設計環境: window10 vs2010
/*
/* Date    : 20180918
/************************************************************************/
#include <iostream>
#include "string"

//Caretaker 管理者
// MememTo  備忘錄
class MememTo { public: MememTo(std::string name,int age ) { m_name = name; m_age = age; } std::string getName() { return m_name; } int getAge() { return m_age; } void setName(std::string name) { this->m_name = name; } void setAge(int age) { this->m_age = age; } private:
std::string m_name; int m_age; }; class Person { public: Person(std::string name,int age ) { m_name = name; m_age = age; } std::string getName() { return m_name; } int getAge() { return m_age; } void setName(std::string name) { this->m_name = name; } void setAge(int age) { this->m_age = age; } //儲存 MememTo* createMememTo() { return new MememTo(m_name, m_age); } //還原 void setMememTo(MememTo* memto) { this->m_age = memto->getAge(); this->m_name = memto->getName(); } public: void printT() { printf ("m_name:%s m_age:%d " ,m_name.c_str(),m_age ); } private: std::string m_name; int m_age; }; class Caretaker { public: Caretaker(MememTo *memto) { this->memto = memto; } MememTo *getMememTo() { return memto; } void setMememTo(MememTo *memto) { this->memto = memto; } protected: private: MememTo *memto; }; void main() { //MememTo *memto = NULL; Caretaker *caretaker = NULL; Person *p = new Person("張三", 32); p->printT(); //建立 Person物件的一個狀態 printf("---------\n"); caretaker = new Caretaker( p->createMememTo()); p->setAge(42); p->printT(); printf("還原舊的狀態\n" ); p->setMememTo(caretaker->getMememTo()); p->printT(); delete caretaker; delete p; }

python程式碼示例

# -*- coding: utf-8 -*-
###################################################################
# 設計模式專題
# 
# 備忘錄模式
# 
# Author  : zzl
# 
# 程式設計環境: window10 python2.7
# 
# Date    : 20180918
##################################################################


class MememTo(object):
    def __init__(self, name, age):
        self.m_name = name
        self.m_age = age;


class Person(object):
    def __init__(self, name, age):
        self.m_name = name
        self.m_age = age

    # 建立
    def create_mememto(self):
        return MememTo(self.m_name, self.m_age)

    # 還原
    def set_mememto(self, memto):
        self.m_age = memto.m_age
        self.m_name = memto.m_name

    def show(self):
        print("m_name:%s  m_age:%s " % (self.m_name, self.m_age))


class Caretaker(object):
    def __init__(self, memto):
        self.memto = memto

    def get_mememto(self):
        return self.memto

    def set_mememto(self, memto):
        self.memto = memto


if __name__ == "__main__":
    p = Person("張三", 32)
    p.show()

    # 建立Person物件的一個狀態
    print("---------")
    caretaker = Caretaker(p.create_mememto())
    p.m_age = 42
    p.show()

    print("還原舊的狀態")
    p.set_mememto(caretaker.get_mememto())
    p.show()

原始碼連結