本文主要是介绍设计模式学习笔记(二十)——Memento备忘录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
十八、Memento(备忘录)
情景举例:
捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
代码示例:
class Graphic;
// base class for graphical objects in the graphical editor
/* 原发器的接口。注意:这是个Singleton模式
*/
class ConstraintSolver {
public:
static ConstraintSolver* Instance();
/*
*/
void Solve();
void AddConstraint(
Graphic* startConnection, Graphic* endConnection
);
void RemoveConstraint(
Graphic* startConnection, Graphic* endConnection
);
/*
*/
ConstraintSolverMemento* CreateMemento();
void SetMemento(ConstraintSolverMemento*);
private:
// nontrivial state and operations for enforcing
// connectivity semantics
};
/* 备忘录的接口。将原发器申明为友元是为了对原发器提供宽接口,而对其他
对象只提供窄接口
*/
class ConstraintSolverMemento {
public:
virtual ~ConstraintSolverMemento();
private:
friend class ConstraintSolver;
ConstraintSolverMemento();
// private constraint solver state
};
/* 一个使用备忘录的Commond模式,记忆了状态以供撤销。
*/
class MoveCommand {
public:
MoveCommand(Graphic* target, const Point& delta);
void Execute();
void Unexecute();
private:
ConstraintSolverMemento* _state;
Point _delta;
Graphic* _target;
};
/* 在执行的时候产生一个备忘录。Solve方法解释由AddConstraint添加的约
束(不太明白)。
*/
void MoveCommand::Execute () {
ConstraintSolver* solver = ConstraintSolver::Instance();
_state = solver->CreateMemento(); // create a memento
_target->Move(_delta);
solver->Solve();
}
/* 在撤销的时候从备忘录中恢复状态。
*/
void MoveCommand::Unexecute () {
ConstraintSolver* solver = ConstraintSolver::Instance();
_target->Move(-_delta);
solver->SetMemento(_state); // restore solver state
solver->Solve();
}
/*
*/
个人理解:
备忘录模式主要由原发器和备忘录构成。主要特点是备忘录对原发器是宽接口,而对其他对象是窄接口。另外,也应该找个适当的地方存储备忘录。(说实话,这个例子不太明了,我仍旧有些地方不太明白。)
这篇关于设计模式学习笔记(二十)——Memento备忘录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!