23种设计模式之(十九)备忘录模式(python_c++实现)

23种设计模式之(十九)备忘录模式(Memento)

本文主要介绍23种设计模式之备忘录模式,附详细python/c++示例代码。

  • 概念
  • 应用场景
  • 注意事项
  • 代码示例
  • 总结
  • 代码链接

备忘录模式(Memento)

概念

备忘录模式,是行为模式之一,它的作用是保存对象的内部状态,并在需要的时候(undo/rollback)恢复对象以前的状态。

GoF对备忘录模式的定义是:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。

应用场景

(1)、 需要保存/恢复数据的相关状态场景。
(2)、 提供一个可回滚的操作。对象之间的耦合度。

C++代码示例

/************************************************************************/
/* 设计模式专题
/*
/* 备忘录模式
/*
/* Author  : zzl
/*
/* 编程环境: window10 vs2010
/*
/* Date    : 20180918
/************************************************************************/
#include 
#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()

源码链接

设计模式(十九)备忘录模式示例代码(python–c++)

你可能感兴趣的:(设计模式,设计模式,python,c++)