PHP设计模式之备忘模式

1、Norton Ghost的方便与问题

我们大多数win的用户都用过Norton Ghost,只要将目前系统备份一下生成镜像文件,等系统中毒或崩溃的时候,用Norton
Ghost恢复一下就回到备份时候的样子了。

这个可以说就是备忘(Memento)模式的基本原理了,先备份,需要的时候恢复。因此备忘模式是比较好理解的。

但在实际应用中,如何正确的应用备忘模式,是需要注意的。

难道我们在word写文章的时候,先要Ghost备份一下所有的硬盘,一旦文章写错了,需要恢复,就用Ghost覆盖硬盘?

就像有些网站的备份系统,做的是全站恢复,虽然方便,但是他的备份和恢复的范围和Norton Ghost是类似的。

如果仅仅是调整了某个页面的分页列表的样式,那么会遇到以下问题:

1、99%的数据都没变化,也就是99%的备份和恢复都是多余的

2、全站备份和恢复,对于服务器的压力是很大的,甚至拖垮服务器

3、执行时间可能很长

4、全站数据操作,一旦中途操作失败,就不得不重头再来

2、php开发的“undo”功能

我们平时用的很多软件都提供了一个叫“undo”或“撤销”的功能,可以对前面一个操作进行撤销,那么我们开发php也可以借鉴。

这样我们可以更好的应用和理解Memento模式,因为备份和恢复是可以做到各种粒度上的。

例:

  1. <?php

  2. //备忘类

  3. class Memento

  4. {

  5. public function backup()

  6. {

  7. //保存现有的分页样式

  8. echo ‘样式已经保存<br>‘;

  9. }
  10. public function restore()

  11. {

  12. //用保存的样式去覆盖

  13. echo ‘样式已经恢复<br>‘;

  14. }

  15. }
  16. //设置分页样式

  17. class ListStyle

  18. {

  19. //备忘对象

  20. private $memento;
  21. //构造方法

  22. public function __construct()

  23. {

  24. $this->memento = new Memento();

  25. }
  26. //设置样式

  27. public function setStyle()

  28. {

  29. //开始先备份样式

  30. $this->memento->backup();
  31. //设置样式

  32. echo ‘设置了样式<br>‘;

  33. }
  34. //撤销方法

  35. public function undo()

  36. {

  37. $this->memento->restore();

  38. }

  39. }
  40. $listStyle = new ListStyle();

  41. //设置样式,同时备份

  42. $listStyle->setStyle();

  43. //撤销设置

  44. $listStyle->undo();

  45. ?>

这样就不必全站备份和恢复了。

2、php开发的“redo”功能

前面我们实现了“undo”功能,那个其他软件里与此对应的还有一个就是“redo”功能,通常叫“重做”。

因此我们需要改进一下代码。

例:

  1. <?php

  2. //备忘类

  3. class Memento

  4. {

  5. public function backup()

  6. {

  7. //保存现有的分页样式

  8. echo ‘样式已经保存<br>‘;

  9. }
  10. public function restore()

  11. {

  12. //用保存的样式去覆盖

  13. echo ‘样式已经恢复<br>‘;

  14. }

  15. }
  16. //设置分页样式

  17. class ListStyle

  18. {

  19. //备忘对象

  20. private $memento;
  21. //构造方法

  22. public function __construct()

  23. {

  24. $this->memento = new Memento();

  25. }
  26. //设置样式

  27. public function setStyle()

  28. {

  29. //开始先备份样式

  30. $this->memento->backup();
  31. //设置样式

  32. echo ‘设置了样式<br>‘;

  33. }
  34. //撤销方法

  35. public function undo()

  36. {

  37. //先保存,为了redo

  38. $this->memento->backup();

  39. $this->memento->restore();

  40. }
  41. //重做方法

  42. public function redo()

  43. {

  44. $this->memento->restore();

  45. }

  46. }
  47. $listStyle = new ListStyle();

  48. //设置样式,同时备份

  49. $listStyle->setStyle();

  50. //撤销设置

  51. $listStyle->undo();

  52. //重做设置

  53. $listStyle->redo();

  54. ?>

这样一来,我们可以提供了精细的备忘模式的实现。              
                更多PHP教程,请访问代码家园

思考:

备忘模式是一种常用的模式,特别是软件开发中,对于php,也可以应用在一些场合。

但是php的备忘模式,常常需要注意可行性,因为软件,比如word之类的,都是单机为主,而php的网站往往被许多用户同时访问。

大量的访问,如果此时备份,服务器是否能承受?如何解决并发访问的数据一致性?

尽管本文讨论了精细的、独立的备忘模式的应用,但是在实际应用中,还需要根据具体情况应用不同的策略

本文原地址:http://www.daimajiayuan.com/sitejs-16852-1.html

PHP设计模式之备忘模式,布布扣,bubuko.com

时间: 2024-08-25 13:00:27

PHP设计模式之备忘模式的相关文章

11. 星际争霸之php设计模式--备忘模式

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦! 本文地址:http://www.cnblogs.com/davidhhuan/p/4248190.html============================================

Javascript备忘模式

使用备忘模式,利用了函数的自定义属性,先看一个例子 var test = function (){} test.myAttr = "attr"; 这样,就给test加上了一个自定义的属性,myAttr. 备忘模式,正式利用了这个方法,将已经运行过的结果存储起来,将函数接受到的参数作为key,将函数运行的结果作为value返回即可.代码如下 var myFunc = function (param) { if(!myFunc.cache[param]){ var result = {};

备忘模式

<?php //备忘类 class Memento { public $ore;//水晶矿 public $gas;//气矿 public $troop;//玩家所有的部队对象 public $building;//玩家所有的建筑对象 //构造方法,参数为要保存的玩家的对象,这里强制参数的类型为Player类 public function __construct(Player $player) { $this->ore = $player->ore;//保存这个玩家的水晶矿 $this

Objective-C教程备忘单

终极版本的Objective-C教程备忘单帮助你进行iOS开发. 想开始创建你的第一个iOS应用程序么?那么看一下这篇很棒的教程吧:Create your first iOS 7 Hello World Application 注:这篇文章我写了三天,可能在一些必要的地方使用了编辑和说明,所以如果有任何疑问和修改建议请在下方评论. 这不是一个初学者指南,也不是关于Objective-C的详细讨论,这是关于常见的和高水平的论题的快速索引. 如果这里有些问题没有涉及到,你也可以查阅以下文章: Obj

C++设计模式实现--备忘录(Memento)模式

一. 备忘录模式 定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 结构图: 使用范围: Memento 模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,Originator 可以根据保存的 Memento 信息还原到前一状态. 代码: [cpp] view plaincopy //备忘录类 //负责存储 Originator 对象的内部状态 class Meme

RxJava & RxAndroid备忘

"你问我要去向何方,我指着大海的方向" 今天在刷G+的时候看到Dave Smith推荐了一个视频 <Learning RxJava (for Android) by example> 点进去看了一下,原来是位熟悉的"阿三哥",视频封面如下:(没有歧视的意思,不要喷我啊~,为什么感到熟悉?接着往下看) 几乎同时也看到了JetBrains在G+也推荐了篇在Medium上的博文 <RxAndroid And Kotlin (Part 1)> ,然后

设计模式之简单工厂模式

设计模式之简单工厂模式 动机:         不暴露实例化逻辑来创建对象.通过公共的接口创建新的对象.         这是一个简单的实现,客户端需要一个product,但是client不直接使用new对象,而是通过提供需要的对象信息来找factory得到新的product.         这个factory实例化一个具体的product并返回(转化成抽象的类),client段使用这个抽象的类而不用考虑它具体的实现. 应用举例:        也许工厂模式是使用最多的模式之一.举个例子,一个

Table view 备忘

Table view 备忘 本篇会以备忘为主,主要是一些基础的代理方法和数据源方法具体的优化好点子会后续跟上. Table view的数据源方法 必须实现的数据源方法 // 返回每一行的cell,可以做缓存处理,同样也可能会造成复用问题. func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { // tableview 和 cell 都是在s

设计模式之行为型模式—— 3.7 备忘录模式

<?php /**  * 3.7 备忘录模式  *  定义:  *  在不破坏封装性的前提下,捕获一个对象的内  *  部状态,并在该对象之外保存这个状态,这样  *  以后就可将该对象恢复到原先保存的状态.  *  * 角色:  *  1. 发起人(Originator)类  *  职责:负责创建一个备忘录Memento,用以  *    记录当前时刻它的内部状态,并可  *    使用备忘录恢复内部状态.Originator  *    可根据需要决定Memento存储它的哪  *    些