PHP デザインパターンの責任連鎖モデルを 1 つの記事で理解する
責任連鎖モデルは動作設計モデルです。リクエストはプロセッサ チェーンに沿って送信されます。リクエストを受信した後、各プロセッサはリクエストを処理するか、チェーン上の次のプロセッサにリクエストを渡すことができます。チェーン上の各プロセッサには独自の処理責任があるため、責任チェーン モデルと呼ばれます。
シナリオ
現在システムがあり、そのシステムへのアクセスを制限したいとします。 1 つ目はログイン認証で、このシステムへのすべてのリクエストを取得するにはログインする必要があります。
しばらくして、上司はクローラー対策プログラムを追加する必要があると感じました。上司の最大の任務は、すぐに元の認証コードにクローラー対策機能を追加することです。現時点では、ログイン検証とクローラ対策検証はそれほど複雑ではありません。しかし、数日後、上司は電流制限の検証を追加する必要があると感じました...数日後、上司は…
検証に関連するコード ブロックが肥大化し、コードを読み取ったり保守したりすることが困難になりました。このとき、責任連鎖モデルを使って検証機能システムを書き直すと、次のようになります。
責任連鎖モデルにより、複数のプロセッサがリクエストを処理する機会があります。元のモジュールを複数のプロセッサに分割して処理すると、単一責任の原則に準拠し、コードの可読性が大幅に向上します。また、拡張も非常に簡単で、新たな検証機能が必要な場合には、開閉原理に準拠した新しいプロセッサを追加するだけで済みます。
責任連鎖パターン構造
責任連鎖パターン構造のコードを完成させましょう。各ハンドラーの機能は非常に単純で、リクエストを処理し、次のリクエスト ハンドラーを設定することです。以下はサンプル コードです:
abstract class AHandler { protected $nextHandler = null; public function setNext (AHandler $handler) { $this->nextHandler = $handler; } abstract public function handler (); } class Handler1 extends AHandler { public function handler() { $handled = false; // 处理请求 echo 'Handler1接受到了请求' . PHP_EOL; if (!$handled && $this->nextHandler) { $this->nextHandler->handler(); } } } class Handler2 extends AHandler { public function handler() { $handled = false; // 处理请求 echo 'Handler2接受到了请求' . PHP_EOL; if (!$handled && $this->nextHandler) { $this->nextHandler->handler(); } } } class Handler3 extends AHandler { public function handler() { $handled = false; // 处理请求 echo 'Handler3接受到了请求' . PHP_EOL; if (!$handled && $this->nextHandler) { $this->nextHandler->handler(); } } }
使用コードの例は次のとおりです:
$handler1 = new Handler1(); $handler2 = new Handler2(); $handler3 = new Handler3(); $handler1->setNext($handler2); $handler2->setNext($handler3); $handler1->handler();
上記のコードは責任の連鎖の構造を完成させていますが、まだいくつかの問題があります。プログラマはビジネスまたは責任連鎖モデルを理解していません。明確すぎると、次のコードをハンドラー メソッドに追加するのを忘れる可能性があります。
if (!$handled && $this->nextHandler) { $this->nextHandler->handler(); }
その場合、責任連鎖は中断されます。さらに、10 個以上のプロセッサがある場合は、10 個の新しいプロセッサが作成され、setNext が 9 回実行されます。うっかり間違ったことを書いてしまったら、恥ずかしい思いをすることになります。
さて、上記のコードを変更してみましょう。変更後のコードは次のとおりです:
abstract class AHandler { protected $nextHandler = null; public function setNext (AHandler $handler) { $this->nextHandler = $handler; } // 使用了模板方法模式,防止程序员忘记写下段代码 public function handler () { if (!$this->doHandler() && $this->nextHandler) { $this->nextHandler->handler(); } } abstract public function doHandler (); } class Handler1 extends AHandler { public function doHandler() { $handled = false; // 处理请求 echo 'Handler1接受到了请求' . PHP_EOL; return $handled; } } class Handler2 extends AHandler { public function doHandler() { $handled = false; // 处理请求 echo 'Handler2接受到了请求' . PHP_EOL; return $handled; } } class Handler3 extends AHandler { public function doHandler() { $handled = false; // 处理请求 echo 'Handler3接受到了请求' . PHP_EOL; return $handled; } } class HandlerChain { private $handlerChains = []; public function __construct(array $handlerChains) { $this->handlerChains = $handlerChains; } public function addHandler (AHandler $handler) { $this->handlerChains[] = $handler; } public function handler () { $hdCnt = count($this->handlerChains); for ($i = 0; $i < $hdCnt; $i ++) { if (isset($this->handlerChains[$i]) && isset($this->handlerChains[$i+1])) { $this->handlerChains[$i]->setNext($this->handlerChains[$i+1]); } } $this->handlerChains[0]->handler(); } }
次に、コードを次のように使用します:
$handler1 = new Handler1(); $handler2 = new Handler2(); $handler3 = new Handler3(); $handerChian = new HandlerChain([$handler1, $handler2, $handler3]); $handerChian->handler();
より簡単実装方法
実際には、責任連鎖パターンを実装するより簡単な方法があります。コードは次のとおりです。
abstract class AHandler { abstract public function handler (); } class Handler1 extends AHandler { public function handler() { $handled = false; // 处理请求 echo 'Handler1接受到了请求' . PHP_EOL; return $handled; } } // Handler2、Handler3代码省略 class HandlerChain { private $handlerChains = []; public function __construct(array $handlerChains) { $this->handlerChains = $handlerChains; } public function addHandler (AHandler $handler) { $this->handlerChains[] = $handler; } public function handler () { foreach ($this->handlerChains as $handler) { if ($handler->handler()) { break; } } } }
概要
責任連鎖モデルを通じて、複数のプロセッサがリクエストを処理する機会があります。元のモジュールを複数のプロセッサに分割して処理すると、単一責任の原則に準拠し、コードの可読性が大幅に向上します。また、拡張も非常に簡単で、新しい機能が必要な場合には、新しいプロセッサを追加するだけです。
一般的な設計パターンの定義は、プロセッサがリクエストを処理できない場合、リクエストを次のプロセッサに渡すというものです。実際には、各プロセッサがリクエストを処理するというバリエーションもあります。
以上がPHP デザインパターンの責任連鎖モデルを 1 つの記事で理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

記事では、入力検証、認証、定期的な更新など、脆弱性から保護するためのフレームワークの重要なセキュリティ機能について説明します。

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。

PHP開発でPHPのCurlライブラリを使用してJSONデータを送信すると、外部APIと対話する必要があることがよくあります。一般的な方法の1つは、Curlライブラリを使用して投稿を送信することです。
