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()