/**
* ハンドラーの抽象化。
* ChainOfResponsibility の一部になりたいオブジェクトは、このインターフェイスを直接実装するか、AbstractHandler からの
* 継承を介して実装する必要があります。
*/
インターフェース KeyValueStore
{
/**
* 値を取得します。
* @param string $key
* @returnmixed
*/
public function get($key);
}
/**
* キャッシュや取得の干渉に関心のない ConcreteHandler が継承する基本的な no-op 実装。
*/
抽象クラス AbstractKeyValueStore は KeyValueStore を実装します
{
protected $_nextHandler;
public function get($key)
{
return $this->_nextHandler->get($key);
}
}
/**
* チェーン内の最後の ConcreteHandler が理想的です。少なくとも、
* チェーンに挿入された場合、それが呼び出される最後のノードになります。
*/
クラス SlowStore は KeyValueStore を実装します
{
/**
* これは、データベースまたはフラット ファイルなど、やや遅いストアである可能性があります。
*/
protected $_values;
public function __construct(array $values = array())
{
$this->_values = $values;
}
public function get($key)
{
return $this->_values[$key];
}
}
/**
*
* 独自のキャッシュ内でキーを検索することでキーのリクエストを処理する ConcreteHandler。キャッシュミスの場合は次のハンドラーに転送します。
*/
class InMemoryKeyValueStore は KeyValueStore を実装します
{
protected $_nextHandler;
protected $_cached = array();
public function __construct(KeyValueStore $nextHandler)
{
$this->_nextHandler = $nextHandler;
}
保護関数 _load($key)
{
if (!isset($this->_cached[$key])) {
$this->_cached[$key] = $this->_nextHandler ->get($key);
}
}
パブリック関数 get($key)
{
$this->_load($key);
return $this->_cached[$key];
}
}
/**
*
* まったく理解しようとせずにリクエストを委任する ConcreteHandler。
* html を生成するメソッドを定義したり、同様のユーザー インターフェースの問題に対処したりすることで、それ自体を特化できるため、ユーザー インターフェース
* で使用する方が簡単かもしれません。
* 一部のクライアントはこのオブジェクトを KeyValueStore
* のインスタンスとしてのみ認識し、それがリクエストを満たす方法を気にしませんが、他のクライアント
* はそれ全体を使用する可能性があります (クラスベースのアダプターと同様)。
* ハンドラーのチェーンが存在することをクライアントは知りません。
*/
class FrontEnd extends AbstractKeyValueStore
{
public function __construct(KeyValueStore $nextHandler)
{
$this->_nextHandler = $nextHandler;
}
public function getEscaped($key)
{
return htmlentities($this->get($key), ENT_NOQUOTES, 'UTF-8');
}
}
// クライアントコード
$store = new SlowStore(array('pd' => 'フィリップ・K・ディック',
'ia' => 'アイザック・アシモフ',
'ac' => ; 'アーサー・C・クラーク',
'hh' => 'ヘルムート・ハイセンビュッテル'));
// 開発ではキャッシュをスキップし、$store をフロントエンドに直接渡します
$cache = new InMemoryKeyValueStore($store);
$frontEnd = 新しいフロントエンド($cache);
echo $frontEnd->get('ia'), "n";
echo $frontEnd->getEscaped('hh'), "n";
PHP 責任連鎖設計パターンに関するいくつかの実装メモ:
◆複合パターンの例のように、責任連鎖はオブジェクト グラフにすでに存在している可能性があります
◆さらに、ハンドラーの抽象化は存在する場合と存在しない場合があります。最終的には、handleRequest() 操作のみを実行できる別の Handler インターフェイスを選択することをお勧めします。後者は既に存在するため、チェーンを 1 つのレベルのみに強制的に含めないでください。クラスですが、リクエスト処理は通常の処理であるため、特定のクラスが他のクラスを継承している可能性があることに注意してください。
◆コンストラクターまたはセッターを通じて、ハンドラー (または次のハンドラー) がクライアントまたは前のハンドラーに挿入されます。
◆リクエスト オブジェクトは通常、ValueObject であり、これも実装されます。PHP では、文字列などのスカラー型である場合があります。一部の言語では、文字列は不変の ValueObject であることに注意してください。
責任連鎖モデルの簡単な概要は次のように要約できます。 一連のクラスを使用してリクエストを処理しようとする。 これらのクラス間には疎結合がある。共通するのは、それらの間でリクエストを渡すことだけである。つまり、リクエストが来ると、まずクラス A が処理し、処理されない場合はクラス C に渡されて処理されます。チェーン。
http://www.bkjia.com/PHPjc/327557.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/327557.html技術記事責任連鎖パターンの目的は、オブジェクトの連鎖を編成してメソッド呼び出しなどのリクエストを処理することです。 ConcreteHandler (コンクリートハンドラー) がクライアントからのリクエストを満たす方法がわからない場合...