PHP の責任連鎖モデルに関する簡単な説明
在之前的文章《一起聊聊PHP中的策略模式》中我们介绍了PHP中的策略模式,下面本篇文章带大家了解一下PHP中的责任链模式。
责任链模式,属于对象行为型的设计模式。
Gof类图及解释
GoF定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
GoF类图:
代码实现
abstract class Handler { protected $successor; public function setSuccessor($successor) { $this->successor = $successor; } abstract public function HandleRequst($request); }
定义抽象责任链类,使用$successor保存后继链条。
class ConcreteHandler1 extends Handler { public function HandleRequst($request) { if (is_numeric($request)) { return '请求参数是数字:' . $request; } else { return $this->successor->HandleRequst($request); } } } class ConcreteHandler2 extends Handler { public function HandleRequst($request) { if (is_string($request)) { return '请求参数是字符串:' . $request; } else { return $this->successor->HandleRequst($request); } } } class ConcreteHandler3 extends Handler { public function HandleRequst($request) { return '我也不知道请求参数是啥了,你猜猜?' . gettype($request); } }
三个责任链条的具体实现,主要功能是判断传入的数据类型,如果是数字由第一个类处理,如果是字符串,则第二个类处理。如果是其他类型,第三个类统一处理。
$handle1 = new ConcreteHandler1(); $handle2 = new ConcreteHandler2(); $handle3 = new ConcreteHandler3(); $handle1->setSuccessor($handle2); $handle2->setSuccessor($handle3); $requests = [22, 'aaa', 55, 'cc', [1, 2, 3], null, new stdClass]; foreach ($requests as $request) { echo $handle1->HandleRequst($request) . PHP_EOL; }
客户端的调用,依次实例化三个责任链实例,并指定链条成员。创建请求参数,之后通过责任链来进行结果判断。
- 责任链非常适合的一种场景,就是对请求参数进行逐层过滤,就像我们工作时使用钉钉之类的办公软件。当需要提加班或者休假申请时,那一层层的审批流程就是对这个模式最完美的解释
- 我们可以拦截请求,直接返回,也可以对请求内容进行完善修改交给下一个类来进行处理,但至少有一个类是要返回结果的。
- 请求不一定都会被处理,也有可能完全不处理就返回或者传递给下一个处理类来进行处理
我们一直在说手机制造这个行业,之前我们一直是交给代工厂来进行手机的组装生产,这回,我们自己建立了一条流水线。而这个流水线,就非常像责任链模式,怎么说呢,从一台手机的装配说起。有操作员将手机主板(初始请求)放到流水线上,然后工人开始添加内存、CPU、摄像头(各种责任链条类进行处理),期间也会经过测试和调整以达到最佳出厂性能。最后拼装成一台完整的手机交到客户的手中,这种工作流是不是和责任链非常相似呢!!
完整代码:https://github.com/zhangyue0503/designpatterns-php/blob/master/11.chain-of-responsiblity/source/chain.php
实例
依然还是短信功能,但这次我们要实现的是一个短信内容过滤的子功能。大家都知道,我们对广告有着严格的规定,许多词都在广告法中被标记为禁止使用的词汇,更有些严重的词汇可能会引来不必要的麻烦。这时候,我们就需要一套过滤机制来进行词汇的过滤。针对不同类型的词汇,我们可以通过责任链来进行过滤,比如严重违法的词汇当然是这条信息都不能通过。一些比较严重但可以绕过的词,我们可以进行替换或者加星处理,这样,客户端不需要一大堆的if..else..来进行逻辑判断,使用责任链让他们一步步的进行审批就好啦!!
短信发送类图
完整源码:https://github.com/zhangyue0503/designpatterns-php/blob/master/11.chain-of-responsiblity/source/chain-filter-message.php
// 词汇过滤链条 abstract class FilterChain { protected $next; public function setNext($next) { $this->next = $next; } abstract public function filter($message); } // 严禁词汇 class FilterStrict extends FilterChain { public function filter($message) { foreach (['枪X', '弹X', '毒X'] as $v) { if (strpos($message, $v) !== false) { throw new \Exception('该信息包含敏感词汇!'); } } if ($this->next) { return $this->next->filter($message); } else { return $message; } } } // 警告词汇 class FilterWarning extends FilterChain { public function filter($message) { $message = str_replace(['打架', '丰胸', '偷税'], '*', $message); if ($this->next) { return $this->next->filter($message); } else { return $message; } } } // 手机号加星 class FilterMobile extends FilterChain { public function filter($message) { $message = preg_replace("/(1[3|5|7|8]\d)\d{4}(\d{4})/i", "$1****$2", $message); if ($this->next) { return $this->next->filter($message); } else { return $message; } } } $f1 = new FilterStrict(); $f2 = new FilterWarning(); $f3 = new FilterMobile(); $f1->setNext($f2); $f2->setNext($f3); $m1 = "现在开始测试链条1:语句中不包含敏感词,需要替换掉打架这种词,然后给手机号加上星:13333333333,这样的数据才可以对外展示哦"; echo $f1->filter($m1); echo PHP_EOL; $m2 = "现在开始测试链条2:这条语句走不到后面,因为包含了毒X,直接就报错了!!!语句中不包含敏感词,需要替换掉打架这种词,然后给手机号加上星:13333333333,这样的数据才可以对外展示哦"; echo $f1->filter($m2); echo PHP_EOL;
说明
- 在这个例子中,我们对消息内容进行了各种处理。当有新的需求产生时,我们只需要加入新的过滤类,然后调整客户端的执行顺序即可
- 使用了next来标识下一步的操作,使用过Laravel的同学一定马上联想到了中间件。当然,用过Node开发服务器的同学更是不会陌生,早就对这个设计模式了如指掌了。
- 责任链的运用真的非常广泛,在各种工作流软件及中间件组件中都可以看到,同时配合Linux下的管道思想,可以把这个模式的优势发挥到极致
- Laravel的中间件,有兴趣的朋友翻翻源码,典型的责任链模式的应用哦
原文地址:https://juejin.cn/post/6844903957974908942
作者:硬核项目经理
推荐学习:《PHP视频教程》
以上がPHP の責任連鎖モデルに関する簡単な説明の詳細内容です。詳細については、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 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

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

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。
