您的位置:首页 > 其它

设计模式学习笔记(二十)——Memento备忘录

2007-04-29 08:53 633 查看
十八、Memento(备忘录)
情景举例:
捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
代码示例:
classGraphic;

//baseclassforgraphicalobjectsinthegraphicaleditor

/*原发器的接口。注意:这是个Singleton模式

*/

classConstraintSolver{

public:

staticConstraintSolver*Instance();

/*

*/

voidSolve();

voidAddConstraint(

Graphic*startConnection,Graphic*endConnection

);

voidRemoveConstraint(

Graphic*startConnection,Graphic*endConnection

);

/*

*/

ConstraintSolverMemento*CreateMemento();

voidSetMemento(ConstraintSolverMemento*);

private:

//nontrivialstateandoperationsforenforcing

//connectivitysemantics

};

/*备忘录的接口。将原发器申明为友元是为了对原发器提供宽接口,而对其他

对象只提供窄接口

*/

classConstraintSolverMemento{

public:

virtual~ConstraintSolverMemento();

private:

friendclassConstraintSolver;

ConstraintSolverMemento();


//privateconstraintsolverstate

};

/*一个使用备忘录的Commond模式,记忆了状态以供撤销。

*/

classMoveCommand{

public:

MoveCommand(Graphic*target,constPoint&delta);

voidExecute();

voidUnexecute();

private:

ConstraintSolverMemento*_state;

Point_delta;

Graphic*_target;

};

/*在执行的时候产生一个备忘录。Solve方法解释由AddConstraint添加的约

束(不太明白)。

*/

voidMoveCommand::Execute(){

ConstraintSolver*solver=ConstraintSolver::Instance();

_state=solver->CreateMemento();//createamemento

_target->Move(_delta);

solver->Solve();

}

/*在撤销的时候从备忘录中恢复状态。

*/

voidMoveCommand::Unexecute(){

ConstraintSolver*solver=ConstraintSolver::Instance();

_target->Move(-_delta);

solver->SetMemento(_state);//restoresolverstate

solver->Solve();

}

/*

*/

个人理解:
备忘录模式主要由原发器和备忘录构成。主要特点是备忘录对原发器是宽接口,而对其他对象是窄接口。另外,也应该找个适当的地方存储备忘录。(说实话,这个例子不太明了,我仍旧有些地方不太明白。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: