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

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

Jul 21, 2016 pm 03:07 PM
php対処する物体方法はいモデル深く行く目的整理する解析するデザインパターン責任

責任連鎖パターンの目的は、オブジェクトの連鎖を編成してメソッド呼び出しなどのリクエストを処理することです。
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 (コンクリートハンドラー) がクライアントからのリクエストを満たす方法がわからない場合...
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
PHPメール:ステップバイステップ送信ガイドPHPメール:ステップバイステップ送信ガイドMay 09, 2025 am 12:14 AM

PhpisusedForsedingEmailsDueToitsIttegration withServerMailServicesAndExternalSmtpproviders、自動化とMarketingCampaign.1)SetupYourphpenvironment withebeBironment witheBiserverandphp、保証

PHP経由で電子メールを送信する方法:例とコードPHP経由で電子メールを送信する方法:例とコードMay 09, 2025 am 12:13 AM

メールを送信する最良の方法は、PHPMailerライブラリを使用することです。 1)Mail()関数を使用することはシンプルですが信頼できないため、電子メールがスパムを入力するか、配信できない場合があります。 2)PHPMailerは、より良い制御と信頼性を提供し、HTMLメール、添付ファイル、SMTP認証をサポートします。 3)SMTP設定が正しく構成されていることを確認し、暗号化(StartTLSやSSL/TLSなど)を使用してセキュリティを強化します。 4)大量の電子メールについては、メールキューシステムを使用してパフォーマンスを最適化することを検討してください。

高度なPHPメール:カスタムヘッダーと機能高度なPHPメール:カスタムヘッダーと機能May 09, 2025 am 12:13 AM

customedersandaddadvancedfeaturesinphpemailentalitylivainability.1)customederadddetadata fortrackingandcategorization.2)htmLemailsallowStingtintintintintintinteractivity.3)添付物質の添付物質の添付

php&smtpでメールを送信するためのガイドphp&smtpでメールを送信するためのガイドMay 09, 2025 am 12:06 AM

PHPとSMTPを使用してメールを送信することは、PHPMailerライブラリを介して実現できます。 1)PHPMailerをインストールして構成する、2)SMTPサーバーの詳細を設定する、3)電子メールコンテンツを定義し、4)メールを送信してエラーを処理します。この方法を使用して、電子メールの信頼性とセキュリティを確保します。

PHPを使用して電子メールを送信する最良の方法は何ですか?PHPを使用して電子メールを送信する最良の方法は何ですか?May 08, 2025 am 12:21 AM

BestappRoachforseminginphpisusingthephpmailerlibrarydueToitsReliability、featurrichness、andeaseofuse.phpmailerSupportssmtpは、detairederorhandlingを提供します

PHPでの依存関係注射のベストプラクティスPHPでの依存関係注射のベストプラクティスMay 08, 2025 am 12:21 AM

依存関係注射(DI)を使用する理由は、コードのゆるい結合、テスト可能性、および保守性を促進するためです。 1)コンストラクターを使用して依存関係を注入します。2)サービスロケーターの使用を避け、3)依存関係噴射コンテナを使用して依存関係を管理する、4)依存関係を注入することでテスト可能性を向上させる、5)注入依存性を回避、6)パフォーマンスに対するDIの影響を考慮します。

PHPパフォーマンスのチューニングのヒントとコツPHPパフォーマンスのチューニングのヒントとコツMay 08, 2025 am 12:20 AM

phpperformancetuningisucial cuseenhancess andandandadsand。

PHP電子メールセキュリティ:電子メールを送信するためのベストプラクティスPHP電子メールセキュリティ:電子メールを送信するためのベストプラクティスMay 08, 2025 am 12:16 AM

bestpracticesforsendingemails securlyinphpinclude:1)sutureconsmttarttlsencryptionとの使用の使用、2)検証およびサンシジン化のinputStopReventinjectuctacks、3)adinitivedinitivedInemailsopenslsl、4)adlinglinglingemailoaに

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。