ホームページ >バックエンド開発 >PHPチュートリアル >マルチレベルキャッシュの実装---責任連鎖モデル

マルチレベルキャッシュの実装---責任連鎖モデル

WBOY
WBOYオリジナル
2016-07-25 09:06:211136ブラウズ
マルチレベルのキャッシュ責任連鎖モデル。
* クライアントはそれをハンドラーに送信し、ハンドラーはタスクを処理できる関数を責任チェーン内で見つけて処理します。これは次のように要約できます。 一連のクラスを使用してリクエストを処理しようとします。これらのクラス間の疎結合であり、共通点は、それらの間でリクエストを渡すということだけです。つまり、リクエストが届いた場合、クラス A がそれを最初に処理します。処理されない場合は、クラス C に渡されて処理されます。チェーン (連鎖) が渡されます。
  1. /**
  2. * 責任連鎖パターン。その目的は、メソッド呼び出しなどのリクエストを処理するためにオブジェクト チェーンを編成することです。
  3. *
  4. * 責任の連鎖の最も有名な例は、マルチレベル キャッシュです。
  5. * クライアントはそれをハンドラーに送信し、ハンドラーはタスクを処理できる関数を責任チェーン内で見つけて処理します
  6. * これは次のように要約できます: 一連のクラスを使用してリクエストを処理しようとします。これらのクラス間には疎結合があります
  7. * 共通しているのは、リクエストがそれらの間で受け渡されることです。つまり、リクエストが処理されなかった場合、クラス A が最初にそれを処理します。 * は処理のためにクラス B に渡され、処理されない場合はクラス C に渡されて処理されます。
  8. */
  9. /**
  10. * ハンドラーの抽象化。
  11. * ChainOfResponsibility の一部になりたいオブジェクトは、このインターフェイスを直接実装するか、
  12. * AbstractHandler からの継承を介して実装する必要があります。
  13. * インターフェイスまたは
  14. * は抽象処理クラスを継承します
  15. */
  16. interface KeyValueStore{
  17. /**
  18. * 値を取得します。
  19. * @param string $key
  20. * @returnmixed
  21. */
  22. public function get($key) ;
  23. }
  24. /**
  25. * ConcreteHandler が
  26. * キャッシュや取得の干渉に関心を持たない基本的な no-op 実装
  27. * リクエストを受信し、それを満たそうとし、失敗した場合は次のハンドラーに委譲します。
  28. */
  29. 抽象クラス AbstractKeyValueStore は KeyValueStore を実装します{
  30. protected $_nextHandler;
  31. public function get($key){
  32. return $this->_nextHandler->get($key);
  33. }
  34. }
  35. /**
  36. * 理想的には、チェーン内の最後の ConcreteHandler。少なくとも、
  37. * チェーンに挿入された場合、呼び出される最後のノードになります。
  38. * 理想的には、責任チェーン上の最後の具象処理クラスがチェーンに追加され、最後に呼び出されたノードです。
  39. */
  40. class SlowStore は KeyValueStore を実装します{
  41. /**
  42. * これは、データベースまたはフラット ファイルなど、やや遅いストアである可能性があります。
  43. */
  44. protected $_values;
  45. public function __construct(array $values = array()){
  46. $this ->_values = $values;
  47. }
  48. public function get($key){
  49. return $this->_values[$key];
  50. }
  51. }
  52. /**
  53. * 独自のキャッシュでキーを検索してキーのリクエストを処理する ConcreteHandler
  54. * キャッシュ ミスの場合は次のハンドラーに転送します。
  55. * キャッシュ ミスの場合は、次の処理オブジェクトに転送します
  56. */
  57. class InMemoryKeyValueStore は KeyValueStore を実装します{
  58. protected $_nextHandler;
  59. protected $_cached = array();
  60. public function __construct(KeyValueStore $nextHandler){
  61. $this->_nextHandler = $nextHandler;
  62. }
  63. protected function _load($key){
  64. if ( !isset($this->_cached[$key])) {
  65. $this->_cached[$key] = $this->_nextHandler->get($key);
  66. }
  67. }
  68. パブリック関数get($key){
  69. $this->_load($key);
  70. return $this->_cached[$key];
  71. }
  72. }
  73. /**
  74. * 要求を委任せずにリクエストを委任する ConcreteHandler
  75. *全然わかります。 HTML を生成するメソッドを定義したり、同様のユーザー インターフェイスの問題に対処したりすることで、自身を特殊化できるため、ユーザー インターフェイスでの使用が容易になる可能性があります
  76. *。一部のクライアントは、このオブジェクトを KeyValueStore のインスタンスとしてのみ認識します
  77. *リクエストをどのように満たすかは気にしませんが、他のもの
  78. * はそれをそのまま使用する可能性があります (クラスベースのアダプターと同様)。
  79. * ハンドラーのチェーンが存在することをクライアントは認識しません。
  80. * 不用关心调用の特定实现外部の具体的な処理プログラムの後には手間がかかります。
  81. */
  82. class FrontEnd extends AbstractKeyValueStore{
  83. public function __construct(KeyValueStore $nextHandler){
  84. $this->_nextHandler = $nextHandler;
  85. }
  86. public function getEscaped($key){
  87. return htmlentities($this-> get($key), ENT_NOQUOTES, 'UTF-8');
  88. }
  89. }
  90. // クライアント コード
  91. $store = new SlowStore(
  92. array(
  93. 'pd' => 'フィリップ K. ディック',
  94. ' ia' => 'アイザック・アシモフ',
  95. 'ac' => 'アーサー・C・クラーク',
  96. 'hh' => 'ヘルムート・ヘイ.enbttel'
  97. )
  98. );
  99. // 開発中はスキップしますキャッシュし、$store を直接 FrontEnd に渡します
  100. $cache = new InMemoryKeyValueStore($store);
  101. $frontEnd = new FrontEnd($cache);
  102. echo $frontEnd->get('ia')。 "n";
  103. echo $frontEnd->getEscaped('hh')。 "n";
  104. /**
  105. * 期待: ...
  106. * Isaac Asimov
  107. * Helmut Hei.e​​nbttel
  108. *
  109. * 参加者:
  110. ◆クライアント (クライアント): ハンドラー (ハンドラー) にリクエストを送信します
  111. ◆ハンドラー (ハンドラー) 要約: を受け取ります。リクエストを受け取り、何らかの方法でそれを満たす;
  112. ◆ConcreteHandlers (コンクリート ハンドラー): リクエストを受け取り、それを満たそうとし、失敗した場合は次のハンドラーに委譲します。
  113. */
复制發


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。