PHP設計模式之備忘模式

一、Norton Ghost的方便與問題php

咱們大多數win的用戶都用過Norton Ghost,只要將目前系統備份一下生成鏡像文件,等系統中毒或崩潰的時候,用Norton Ghost恢復一下就回到備份時候的樣子了。html

這個能夠說就是備忘(Memento)模式的基本原理了,先備份,須要的時候恢復。所以備忘模式是比較好理解的。服務器

但在實際應用中,如何正確的應用備忘模式,是須要注意的。併發

難道咱們在word寫文章的時候,先要Ghost備份一下全部的硬盤,一旦文章寫錯了,須要恢復,就用Ghost覆蓋硬盤?網站

就像有些網站的備份系統,作的是全站恢復,雖然方便,可是他的備份和恢復的範圍和Norton Ghost是相似的。this

若是僅僅是調整了某個頁面的分頁列表的樣式,那麼會遇到如下問題:spa

一、99%的數據都沒變化,也就是99%的備份和恢復都是多餘的rest

二、全站備份和恢復,對於服務器的壓力是很大的,甚至拖垮服務器htm

三、執行時間可能很長對象

四、全站數據操做,一旦中途操做失敗,就不得不重頭再來

 

二、php開發的「undo」功能

咱們平時用的不少軟件都提供了一個叫「undo」或「撤銷」的功能,能夠對前面一個操做進行撤銷,那麼咱們開發php也能夠借鑑。

這樣咱們能夠更好的應用和理解Memento模式,由於備份和恢復是能夠作到各類粒度上的。

例:

  1. <?php 
  2. //備忘類 
  3. class Memento 
  4. public function backup() 
  5. //保存現有的分頁樣式 
  6. echo '樣式已經保存<br>'
  7.  
  8. public function restore() 
  9. //用保存的樣式去覆蓋 
  10. echo '樣式已經恢復<br>'
  11.  
  12. //設置分頁樣式 
  13. class ListStyle 
  14. //備忘對象 
  15. private $memento
  16.  
  17. //構造方法 
  18. public function __construct() 
  19. $this->memento = new Memento(); 
  20.  
  21. //設置樣式 
  22. public function setStyle() 
  23. //開始先備份樣式 
  24. $this->memento->backup(); 
  25.  
  26. //設置樣式 
  27. echo '設置了樣式<br>'
  28.  
  29. //撤銷方法 
  30. public function undo() 
  31. $this->memento->restore(); 
  32.  
  33. $listStyle = new ListStyle(); 
  34. //設置樣式,同時備份 
  35. $listStyle->setStyle(); 
  36. //撤銷設置 
  37. $listStyle->undo(); 
  38. ?> 

這樣就沒必要全站備份和恢復了。

 

二、php開發的「redo」功能

前面咱們實現了「undo」功能,那個其餘軟件裏與此對應的還有一個就是「redo」功能,一般叫「重作」。

所以咱們須要改進一下代碼。

例:

  1. <?php 
  2. //備忘類 
  3. class Memento 
  4. public function backup() 
  5. //保存現有的分頁樣式 
  6. echo '樣式已經保存<br>'
  7.  
  8. public function restore() 
  9. //用保存的樣式去覆蓋 
  10. echo '樣式已經恢復<br>'
  11.  
  12. //設置分頁樣式 
  13. class ListStyle 
  14. //備忘對象 
  15. private $memento
  16.  
  17. //構造方法 
  18. public function __construct() 
  19. $this->memento = new Memento(); 
  20.  
  21. //設置樣式 
  22. public function setStyle() 
  23. //開始先備份樣式 
  24. $this->memento->backup(); 
  25.  
  26. //設置樣式 
  27. echo '設置了樣式<br>'
  28.  
  29. //撤銷方法 
  30. public function undo() 
  31. //先保存,爲了redo 
  32. $this->memento->backup(); 
  33. $this->memento->restore(); 
  34.  
  35. //重作方法 
  36. public function redo() 
  37. $this->memento->restore(); 
  38.  
  39. $listStyle = new ListStyle(); 
  40. //設置樣式,同時備份 
  41. $listStyle->setStyle(); 
  42. //撤銷設置 
  43. $listStyle->undo(); 
  44. //重作設置 
  45. $listStyle->redo(); 
  46. ?> 

這樣一來,咱們能夠提供了精細的備忘模式的實現。                               更多PHP教程,請訪問代碼家園

 

思考:

備忘模式是一種經常使用的模式,特別是軟件開發中,對於php,也能夠應用在一些場合。

可是php的備忘模式,經常須要注意可行性,由於軟件,好比word之類的,都是單機爲主,而php的網站每每被許多用戶同時訪問。

大量的訪問,若是此時備份,服務器是否能承受?如何解決併發訪問的數據一致性?

儘管本文討論了精細的、獨立的備忘模式的應用,可是在實際應用中,還須要根據具體狀況應用不一樣的策略

 

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

相關文章
相關標籤/搜索