zoukankan      html  css  js  c++  java
  • 备忘录模式之C++实现

    说明:本文仅供学习交流。转载请标明出处,欢迎转载。

            备忘录模式是一种比較简单的设计模式。该模式非常好地体现了一种面向对象的封装思想

    该模式的思想是用一个专门的备份类将当前的状态信息保存起来。在整个过程中用户不能直接接触该备份类,为了达到这个目的。须要创建一个管理类,用户对先前的信息进行备份和还原。这样,假设用户想备份当前信息或者还原至前一个状态,我们能够通过该管理类的对象来调用备份函数和还原函数。

    当然,我们所示全部状态都是由一个执行类提供。

              为了说明上面的思想,我们将上面所提到的执行Originator表示。备忘类Memento表示,管理类Caretaker表示。同一时候各个类都有分工:执行类用于执行当前的状态。管理类用于备份和恢复状态,备忘类则是一种底层的数据结构(用于保存状态信息),是管理类和执行类沟通的桥梁

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

             备忘录模式的结构:

    本图来自《大话设计模式》         

              C++实现代码:

    #include<iostream>
    #include<string>
    using namespace std;
    class Memento//用于保存之前信息的类,这个类不与client打交道
    {
    private:
    	string state;//用于保存之前状态
    public:
    	Memento(){}
    	Memento(string s):state(s){};
    	string GetState(){return state;}
    };
    
    class Originator//行动发起者类,总是相应如今进行时,client用这个类进行正常的操作
    {
    private:
    	string state;//相应的状态为当前的状态
    public:
    	void SetState(string state)//设置状态信息
    	{
    		this->state=state;
    	}
    	Memento CreateMemento()//返回当前的信息
    	{
    		return Memento(state);
    	}
    	void SetMento(Memento mem)
    	{
    		this->state=mem.GetState();
    	}
    	void Show()
    	{
    		cout<<"当前状态为:"<<state<<endl;
    	}
    };
    class CareTaker//管理者,用户端用这个类进行数据的备份
    {
    private:
    	Memento memento;//全部的备份信息都保存在对象mem中
    public:
    	Memento GetMemento()//返回备份信息的对象
    	{
    		return memento;
    	}
    	void SetMemento(Memento men)//备份信息
    	{
    		this->memento=men;
    		cout<<"当前状态信息已备份!"<<endl;
    	}
    };
    
    int main()//client程序
    {
    	Originator org;
    	/*******显示当前的状态信息*******/
    	cout<<"显示当前状态..."<<endl;
    	org.SetState("打开状态!");//将当前的状态设置为打开状态
    	org.Show();
    
    	/*******备份当前的状态信息*******/
    	cout<<endl<<"备份当前的状态信息..."<<endl;
    	CareTaker ct;
    	ct.SetMemento(org.CreateMemento());//备份当前状态信息
    
    	/*******设置新的状态*******/
    	cout<<endl<<"又一次设置当前的状态...."<<endl;
    	org.SetState("关闭状态!");
    	org.Show();
    
    	/********恢复先前的状态*******/
    	cout<<endl<<"恢复先前的状态....."<<endl;
    	org.SetMento(ct.GetMemento());
    	org.Show();
    	return 0;
    }

               測试结果例如以下:

             

    參考资料:

    [1]《大话设计模式》

    [2]《设计模式之禅》

    [3]《HeadFirst设计模式》


  • 相关阅读:
    10分钟教你Python+MySQL数据库操作
    10分钟教你用eclipse上传代码到GitHub
    分享几个有趣的程序代码(有些还是值得学习的哦)~
    10分钟教你生成超高逼格微信朋友圈
    1.maven中pom.xml文件中<exclusions>标签认不到问题
    2. springboot启动报错:Field userMapper in com.service.UserService required a bean of type 'com.dao.UserMapper' that could not be found.
    1. SpringBoot启动后,报异常:This application has no explicit mapping for /error, so you are seeing this as a fallback.
    9. 一个list拆分成多个list返回
    12. myeclipse遇到Initializing java tooling(1%)终极解决办法
    42. oracle通过两张表的一个字段对应,update其中一张表的某个字段
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/6861867.html
Copyright © 2011-2022 走看看