PHP设计模式-备忘录 发表于 2017-04-23 | 分类于 PHP | 评论数: | 阅读次数: 本文字数: 2.6k | 阅读时长 ≈ 2 分钟 适用性 就是外部存储对象的状态,以提供后退/恢复/复原 使用场景:编辑器后退操作/数据库事物/存档 代码示例 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159class Memento{ /** * 备忘录列表 * * @var array */ private $_mementoList = []; /** * 添加编辑器实例状态 * * @param Editor $editor 编辑器实例 */ function add(Editor $editor) { array_push($this->_mementoList, $editor); } /** * 返回编辑器实例上个状态 * * @param Editor $editor 编辑器实例 */ function undo() { return array_pop($this->_mementoList); } /** * 返回编辑器实例开始状态 * * @param Editor $editor 编辑器实例 */ function redo() { return array_shift($this->_mementoList); }}class Editor{ /** * 编辑器内容 * @var string */ private $_content = ''; /** * 备忘录实例 * @var Memento */ private $_memento; /** * 构造函数 * * @param string $content 打开的文件内容 */ function __construct($content='') { $this->_content = $content; // 打印初始内容 $this->read(); // 初始化备忘录插件 $this->_memento = new Memento(); // 第一次打开编辑器自动保存一次以提供重置状态操作 $this->save($content); } /** * 写入内容 * * @param string $value 文本 * @return boolean */ function write($value='') { $this->_content .= $value; $this->read(); } /** * 读取当前内容 * * @param string $value 文本 * @return boolean */ function read() { echo $this->_content? $this->_content . "\n": "空文本" . "\n"; } /** * 保存内容 * * @return boolean */ function save() { $this->_memento->add(clone $this); } /**s * 后退 * * @return boolean */ function undo() { // 获取上个状态 $undo = $this->_memento->undo(); // 重置当前状态为上个状态 $this->_content = $undo->_content; } /** * 复原 * * @return boolean */ function redo() { // 获取开始状态 $undo = $this->_memento->redo(); // 重置当前状态为开始状态 $this->_content = $undo->_content; }}try { // 初始化一个编辑器并新建一个空文件 $editor = new Editor(''); // 写入一段文本 $editor->write('hello php !'); // 保存 $editor->save(); // 修改刚才的文本 $editor->write(' no code no life !'); // 撤销 $editor->undo(); $editor->read(); // 再次修改并保存文本 $editor->write(' life is a struggle !'); $editor->save(); // 重置 $editor->redo(); $editor->read();} catch (\Exception $e) { echo 'error:' . $e->getMessage();}