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.  
  11. public function restore() 
  12. { 
  13. //用保存的样式去覆盖 
  14. echo '样式已经恢复<br>'; 
  15. } 
  16. } 
  17.  
  18. //设置分页样式 
  19. class ListStyle 
  20. { 
  21. //备忘对象 
  22. private $memento; 
  23.  
  24. //构造方法 
  25. public function __construct() 
  26. { 
  27. $this->memento = new Memento(); 
  28. } 
  29.  
  30. //设置样式 
  31. public function setStyle() 
  32. { 
  33. //开始先备份样式 
  34. $this->memento->backup(); 
  35.  
  36. //设置样式 
  37. echo '设置了样式<br>'; 
  38. } 
  39.  
  40. //撤销方法 
  41. public function undo() 
  42. { 
  43. $this->memento->restore(); 
  44. } 
  45. } 
  46.  
  47. $listStyle = new ListStyle(); 
  48. //设置样式,同时备份 
  49. $listStyle->setStyle(); 
  50. //撤销设置 
  51. $listStyle->undo(); 
  52. ?> 

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

 

2、php开发的“redo”功能

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

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

例:

  1. <?php 
  2. //备忘类 
  3. class Memento 
  4. { 
  5. public function backup() 
  6. { 
  7. //保存现有的分页样式 
  8. echo '样式已经保存<br>'; 
  9. } 
  10.  
  11. public function restore() 
  12. { 
  13. //用保存的样式去覆盖 
  14. echo '样式已经恢复<br>'; 
  15. } 
  16. } 
  17.  
  18. //设置分页样式 
  19. class ListStyle 
  20. { 
  21. //备忘对象 
  22. private $memento; 
  23.  
  24. //构造方法 
  25. public function __construct() 
  26. { 
  27. $this->memento = new Memento(); 
  28. } 
  29.  
  30. //设置样式 
  31. public function setStyle() 
  32. { 
  33. //开始先备份样式 
  34. $this->memento->backup(); 
  35.  
  36. //设置样式 
  37. echo '设置了样式<br>'; 
  38. } 
  39.  
  40. //撤销方法 
  41. public function undo() 
  42. { 
  43. //先保存,为了redo 
  44. $this->memento->backup(); 
  45. $this->memento->restore(); 
  46. } 
  47.  
  48. //重做方法 
  49. public function redo() 
  50. { 
  51. $this->memento->restore(); 
  52. } 
  53. } 
  54.  
  55. $listStyle = new ListStyle(); 
  56. //设置样式,同时备份 
  57. $listStyle->setStyle(); 
  58. //撤销设置 
  59. $listStyle->undo(); 
  60. //重做设置 
  61. $listStyle->redo(); 
  62. ?> 

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

 

思考:

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

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

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

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

 

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

posted @ 2014-05-08 18:24  似水星辰  阅读(328)  评论(0)    收藏  举报