検索
ホームページバックエンド開発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怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\&nbsp\;||\xc2\xa0)/","其他字符",$str)”语句。

php怎么判断有没有小数点php怎么判断有没有小数点Apr 20, 2022 pm 08:12 PM

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

php怎么设置implode没有分隔符php怎么设置implode没有分隔符Apr 18, 2022 pm 05:39 PM

在PHP中,可以利用implode()函数的第一个参数来设置没有分隔符,该函数的第一个参数用于规定数组元素之间放置的内容,默认是空字符串,也可将第一个参数设置为空,语法为“implode(数组)”或者“implode("",数组)”。

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。