23種設計模式之(十九)備忘錄模式(python_c++實現) .md
阿新 • • 發佈:2018-12-10
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()