c++设计模式之备忘录模式

来源:互联网 发布:教育大数据服务平台 编辑:程序博客网 时间:2024/06/05 08:16

     最近在看王翔老师写的 设计模式基于c#的工程化实现,比较惊讶于c#的语法表达能力,对书中的备忘录模式,用c++进行改写.

    ==============================================================

    MemoByStack.hpp

    /*抽象状态类型的接口*/
    class State{
    public:
     virtual State *clone() const=0;
    };
   
    class Memento{
    private:
     State *pState;
    public:
     void setState(State *pState);
     State * getState();
    };
   
    /*原发器抽象定义*/
    class OriginatorBase{
    private:
     stack<Memento>  mementoStack;
    protected:
     State *pState;
     virtual Memento createMemento();
    public:
     virtual void saveCheckpoint();
     virtual void undo();
    };
   
    /*具体状态类型*/
    class Position :  public State{
    public:
     Position();
     int x;
     int y;
     State * clone() const
     {
      return new Position(*this);
     }
    };
   
    /*具体原发器类型*/
    class Originator : public OriginatorBase{
    public:
     Originator();
     void updateX(int x);
     void decreaseX();
     void increaseY();
     Position current();
    };
   
    ==========================================================
   
    MemoByStack.cpp
   
    #include "MemoByStack.hpp"
   
    void Memento::setState(State *pState)
    {
     this->pState=pState;
    }
   
    State * Memento::getState()
    {
     return this->pState;
    }
   
    Memento OriginatorBase::createMemento()
    {
     Memento memento;
     memento.setState(pState->clone());
     return memento;
    }
   
    void OriginatorBase::saveCheckpoint()
    {
     mementoStack.push(createMemento());
    }
   
    void OriginatorBase::undo()
    {
     if (mementoStack.empty()==true){
      return;
     }
     Memento memento=mementoStack.top();
     mementoStack.pop();
     this->pState=memento.getState();
    }
   
    Position::Position()
    {
     x=0;
     y=0;
    }
   
    Originator::Originator()
    {
     pState=new Position();
    }
   
    /*强制进行转化*/
    void Originator::updateX(int x)
    {
        ((Position *)pState)->x=x;
    }
   
   
    void Originator::decreaseX()
    {
        ((Position *)pState)->x--;
    }
   
    void Originator::increaseY()
    {
     ((Position *)pState)->y++;
    }
   
    Position Originator::current()
    {
     return *(Position *)pState;
    }
   
    =========================================================
   
    测试代码:
   
    #include <algorithm>
    #include <string>
    #include <vector>
    #include <iostream>
    #include "MemoByStack.hpp"
   
    using namespace std;
   
    void main()
    {
     Originator originator;
     /*保存原发器刚初始化后的状态*/
     originator.saveCheckpoint();   // x = 0, y = 0
     /*对原发器进行修改 1*/
     originator.increaseY();
     originator.decreaseX();
     originator.saveCheckpoint();    // x = -1, y = 1
     /*对原发器进行修改 2*/
     originator.updateX(2);
     originator.saveCheckpoint();    // x = 2, y = 1
     /*对原发器进行修改 3*/
     originator.updateX(3);
     originator.increaseY();         // x = 3, y = 2
     /*确认undo前的状态*/
     cout<<"x: "<<originator.current().x<<endl;
     cout<<"y: "<<originator.current().y<<endl;
     originator.undo();
     cout<<"x: "<<originator.current().x<<endl;
     cout<<"y: "<<originator.current().y<<endl;
     originator.undo();
     cout<<"x: "<<originator.current().x<<endl;
      cout<<"y: "<<originator.current().y<<endl;
    }

原创粉丝点击