首頁 >後端開發 >php教程 >多層級快取的實作---責任鏈模式

多層級快取的實作---責任鏈模式

WBOY
WBOY原創
2016-07-25 09:06:211131瀏覽
複製程式碼
多層級快取責任鏈模式。
* client提交給hander,hander發現責任鏈上能處理該任務的函數,處理;可以歸納為:用一系列類(classes)試圖處理一個請求request,這些類別之間是一個鬆散的耦合,唯一共同點是在他們之間傳遞request. 也就是說,來了一個請求,A類先處理,如果沒有處理,就傳遞到B類處理,如果沒有處理,就傳遞到C類處理,就這樣象一個鏈條(chain)一樣傳遞下去。
  1. /**
  2. * 責任鏈模式,其目的是組織一個物件鏈處理一個如方法呼叫的請求。
  3. *
  4. * 最著名的責任鏈範例:多層快取。
  5. * client提交給hander,hander發現責任鏈上能處理該任務的函數,處理;
  6. * 可以歸納為:用一系列類別(classes)試圖處理一個請求request,這些類別之間是一個鬆散的耦合,
  7. * 唯一共同點是在他們之間傳遞request. 也就是說,來了一個請求,A類先處理,如果沒有處理,
  8. * 就傳遞到B類處理,如果沒有處理,就傳遞到C類處理,就這樣像一個鏈條(chain)一樣傳遞下去。
  9. */
  10. /**
  11. * The Handler abstraction. Objects that want to be a part of the
  12. * ChainOfResponsibility must implement this interface directly or via
  13. * inheritance from an AbstractHandler.* 繼承一個抽象的處理類別
  14. 介面/
  15. 介面KeyValueStore{
  16. /**
  17. * 取得一個值。
  18. * @param string $key
  19. * @return mix
  20. */
  21. public function get($key);
  22. }
  23. /**
  24. * Basic no-op implementation which ConcreteHandlers not interested in
  25. * caching or in interfering with the retrieval inherit from.
  26. * 接收一個請求,設法滿足它,如果不成功就派給下一個處理程序。
  27. */
  28. 抽象類別AbstractKeyValueStore 實作KeyValueStore{
  29. protected $_nextHandler;
  30. public function get($key){
  31. return $this->_nextHandler->get($key);
  32. }
  33. }
  34. /**
  35. * Ideally the last ConcreteHandler in the chain. At least, if inserted in
  36. * a Chain it will be the last node to be called.
  37. * 理想情況下,責任鏈上最後的具體處理類,加入鏈上,將是最後被呼叫的節點。
  38. */
  39. class SlowStore 實作KeyValueStore{
  40. /**
  41. * 這可能是一個有點慢的儲存:資料庫或平面檔案。
  42. */
  43. protected $_values;
  44. public function __construct(array $values = array()){
  45. $-this-this- >_values = $values;
  46. }
  47. public function get($key){
  48. return $this->_values[$key];
  49. }
  50. }
  51. /**
  52. * A ConcreteHandler that handles the request for a key by looking for it in
  53. * its own cache. Forwards to the next handler in case of cache miss.
  54. * 在緩存沒命中的情況下,轉發到下一個處理對象
  55. */
  56. 類別InMemoryKeyValueStore 實作KeyValueStore{
  57. protected $_nextHandler;
  58. protected $_cached = array();
  59. public function __construct(KeyValueore $nextdler. = $nextHandler;
  60. }
  61. 受保護函數_load($key){
  62. if (!isset($this->_cached[$key])) {
  63. $ this->_cached[ $key ] = $this->_nextHandler->get($key);
  64. }
  65. }
  66. public function get($key){
  67. $this->_load($key);
  68. return $this->_cached[$key];
  69. }
  70. }
  71. /**
  72. * 一個ConcreteHandler,它委託請求嘗試而無需
  73. *完全明白。容易在使用者介面中使用
  74. *,因為它可以透過定義產生
  75. * html 的方法或透過解決類似的使用者介面問題來專門化自己。 KeyValueStore
  76. * 的實例,不介意它如何滿足他們的請求,而其他
  77. * 可能會完全使用它(類似於基於類別的玩具)。關心呼籲的具體實現的外部具體具體處理程序;背後是責任鏈。
  78. */
  79. class FrontEnd extends AbstractKeyValueStore{
  80. public function __construct(KeyValueStore $nextHandler){
  81. $this->_nextHandler = $nextHandler;
  82. } return htmlentities($this->get($key), ENT_NOQUOTES, 'UTF-8');
  83. }
  84. }
  85. // 客戶端程式碼
  86. $store = new SlowStore(
  87. array(
  88. 'pd' => 'Philip K. Dick',
  89. 'ia' => '艾薩克·阿西莫夫',
  90. 'ac' => ' Arthur C . Clarke',
  91. 'hh' => 'Helmut Hei.e​​nbttel'
  92. )
  93. );
  94. // 在開發中,我們跳過快取並將$store 直接傳給FrontEnd
  95. $ cache = new InMemoryKeyValueStore($store);
  96. $frontEnd = new FrontEnd($cache);
  97. echo $frontEnd->get('ia'). "n";
  98. echo $frontEnd->getEscaped('hh'). "n";
  99. /**
  100. * expect: ...
  101. * Isaac Asimov
  102. * Helmut Hei.e​​nbttel
  103. *
  104. * 參與者:
  105. ◆Client(客戶端):向Handler(處理程序)提交一個請求;
  106. ◆Handler(處理程序)抽象:接收一個請求,以某種方式滿足它;
  107. ◆ConcreteHandlers(具體的處理程序):接收一個請求,設法滿足它,如果不成功就委派給下一個處理程序。
  108. */
複製程式碼


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn