令人惊艳的代码!!

Powerdix 2002-05-23 05:35:05
这是我在CodeGuru上看到的令人惊艳的代码。(http://www.codeguru.com/misc/undo_redo_cdocument.shtml)。

class CUndo {
private:
CObList m_undolist; // Stores undo states
CObList m_redolist; // Stores redo states
long m_growsize; // Adjust for faster saves
long m_undoLevels; // Requested Undolevels
long m_chkpt;

void AddUndo(CMemFile*);
void AddRedo(CMemFile *pFile);
void Load(CMemFile*);
void Store(CMemFile*);
void ClearRedoList();

public:

// Here are the hooks into the CDocument class
virtual void Serialize(CArchive& ar) = 0;
virtual void DeleteContents() = 0;

// User accessable functions
CUndo(long undolevels = 4, long = 32768); // Constructor
~CUndo(); // Destructor
BOOL CanUndo(); // Returns TRUE if can Undo
BOOL CanRedo(); // Returns TRUE if can Redo
void Undo(); // Restore next Undo state
void Redo(); // Restore next Redo state
void CheckPoint(); // Save current state
void EnableCheckPoint();
void DisableCheckPoint();
};

只要你的应用程序文档类从这个CUndo类派生,可以给SDI/MDI应用程序添加UNDO/REDO的功能。
例如这样:class CMyDoc : public CDocument, public CUndo{};

它使用的实现技巧是利用CMyDoc::Serialize()虚函数保存文档实例的状态,virtual void Serialize(CArchive& ar)=0的声明迫使子类一定要实现它;

我之所以惊叹这段码,并不是它使用的实现技巧,而是它的采用的设计模式。

虽说可以归纳为Command模式的范畴。动态地给一个类添加功能;父类的实现(Undo/Redo)依赖子类的具体实现(CMyDoc::Serialize);
接口和实现的分离,难道就没有Decorator(装饰)Bridge(桥接)的影子?

解脱之味不独饮!
...全文
137 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Powerdix 2002-05-23
  • 打赏
  • 举报
回复
pp_ipr()
一样没有问题,只要你的类实现Serialize()。
我想你的问题主要是无法得到CArchive &ar,其实这很简单。
pp_ipr 2002-05-23
  • 打赏
  • 举报
回复
好!不过我编程一来还没做过文档-视的程序,全做对话框的,感觉少点什么:(
z_sky 2002-05-23
  • 打赏
  • 举报
回复
呵呵,非常钦佩大山的共享精神。好! :-)
Powerdix 2002-05-23
  • 打赏
  • 举报
回复
百试不爽!!
pcman1990 2002-05-23
  • 打赏
  • 举报
回复
以前听说Undo/Redo一种实现方法是通过Serialize在内存中保存文档来实现,现在有源代码太好了,去试试!
谢谢了!
unicode 2002-05-23
  • 打赏
  • 举报
回复
呵呵,NB

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧