最近在看王翔老师写的 设计模式基于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;
}