責任連鎖パターンの目的は、オブジェクトの連鎖を編成してメソッド呼び出しなどのリクエストを処理することです。
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 に渡されて処理されます。チェーン。

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

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

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

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

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

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

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

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


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

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

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

Dreamweaver Mac版
ビジュアル Web 開発ツール

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

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