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;
}
- 设计模式之备忘录
- 设计模式之备忘录
- 设计模式之备忘录
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式 之 备忘录模式
- 设计模式之备忘录模式
- 在PL/SQL中连接ORACLE时,出现:ora-12154:无法解析指定的服务名
- C#SocketSC结构文件传输
- ubuntu安装带debuger 的 FLASH 10 player
- 预编译头pch
- NetBeans 时事通讯(刊号 # 52 - Apr 15, 2009)
- c++设计模式之备忘录模式
- 界面设计注意事项
- ASP.NET的HTTP请求的处理过程、HttpModule和HttpHandler
- 写软件开发需求你必须掌握的规格
- error LNK2001: unresolved external symbol "public: int __thiscall CFtProtocolThread::getFnIds(class _STL::vector > &)" (?getFnId
- .Nat 开发学习
- Moblin应用程序模板
- c++中引用和指针的区别
- AJAX基础