ホームページ > バックエンド開発 > PHPチュートリアル > PHP 設計パターンの責任連鎖パターンの詳細な分析_PHP チュートリアル

PHP 設計パターンの責任連鎖パターンの詳細な分析_PHP チュートリアル

WBOY
リリース: 2016-07-21 15:07:08
オリジナル
888 人が閲覧しました

責任連鎖パターンの目的は、オブジェクトの連鎖を編成してメソッド呼び出しなどのリクエストを処理することです。
ConcreteHandler (特定のハンドラー) がクライアントからのリクエストを満たす方法がわからない場合、またはその目的がこれではない場合、チェーン内の次の Handler (ハンドラー) にその処理を委任します。

このデザイン パターンは通常、複合パターンと一緒に使用され、一部のリーフ オブジェクトまたはコンテナ オブジェクトがデフォルトで親オブジェクトに操作を委任します。もう 1 つの例として、ローカリゼーションは多くの場合、責任の連鎖を使用して処理されます。つまり、ドイツ語翻訳アダプタが翻訳されたキーワードに対して適切な結果を見つけられない場合、英語アダプタにフォールバックするか、単にキーワード自体を表示します。

結合は最小限に抑えられます。Client クラスは、どの特定のクラスがリクエストを処理するかを知りません。ConcreteHandler は、どのオブジェクトがその継承者であるかを知りません。動作はオブジェクト間で正常に分散され、チェーン内で最も近いオブジェクトが優先順位と要求を満たす責任を持ちます。

参加者:
◆クライアント (クライアント): リクエストをハンドラー (ハンドラー) に送信します。
◆ハンドラー (ハンドラー) の抽象化: リクエストを受け取り、何らかの方法でそれを満たします。
◆ConcreteHandlers (具体的なハンドラー):リクエストを受信し、それを満たすことを試み、失敗した場合は次のハンドラーに委譲します。
次のコードは、責任連鎖の最も有名な例の 1 つであるマルチレベル キャッシュを実装しています。

コードをコピーします コードは次のとおりです:

/** 
* ハンドラーの抽象化。
* 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.comtru​​ehttp://www.bkjia.com/PHPjc/327557.html技術記事責任連鎖パターンの目的は、オブジェクトの連鎖を編成してメソッド呼び出しなどのリクエストを処理することです。 ConcreteHandler (コンクリートハンドラー) がクライアントからのリクエストを満たす方法がわからない場合...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート