使用设计模式实现Undo,Redo框架

编辑器程序少不了要支持undo, redo功能,如何实现?本文就是参考了设计模式中给出的思路实现了一个。

这里主要用到了两个模式:命令(command)模式, 备忘录(memento)模式

所谓编辑,功能上可以分成3个原子操作:添加新内容,编辑已有内容,删除已有内容, 因此编辑功能3个command实现,AddCommand, EditCommand, DeleteCommand. 这3个命令实现了相同的接口do, undo.

 

先说一下代码的风格,自从使用WTL,就喜欢上了WTL的代码风格,本文就是仿照WTL风格写的.

先看一下Command的接口:

 

  1. class CCommand  
  2. {
  3. public:
  4.  virtual ~CCommand();
  5. public:
  6.  virtual bool Do() = 0;
  7.  virtual bool Undo() = 0;
  8.  virtual bool CanUndo() = 0;
  9. };

AddCommand, EditCommand, DeleteCommand都实现了这个接口类。

下面WTL风格代码开始了:

先留个空架子

 

 

  1. template<class TBase/*where TBase : public CCommand*/>
  2. class CCommandImplBase : public TBase
  3. {
  4. //先空着,以后留着扩展
  5. };

下面是主要实现:用到了event, 当Command执行时会触发event,你可以在时间里做一些诸如试图更新, 所谓event,跟C#里的事件相似,感兴趣的可以看我前面的文章用C++模拟C#事件机制

 

 

  1. templateclass T, class TBase = CCommand, class TTraits = CommandTraits<T> >
  2. class CCommandImpl : public CCommandImplBase<TBase>
  3. {
  4. public:
  5.  typedef TTraits::CmdEvent CmdEvent;
  6.  typedef CmdEvent::EventHandler EventHandler;
  7. public:
  8.  CCommandImpl(typename CmdEvent::EventArgs/* const& */args) : m_Args(args)
  9.  {
  10. #if (_MSC_VER >= 1300)
  11.   //COMPLIE_ASSERT(IsPointer(args));
  12.   bool bRet = TypeTraits<CmdEvent::EventArgs>::IsPointer();
  13. #endif
  14.  }
  15.  virtual ~CCommandImpl()
  16.  {
  17.  }
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值