什么是责任链模式
责任链就是把每个类的职责串联起来,一个接一个的执行,直到执行完为值。
使用场景
敏感词检测,用户发送一段信息,可能会有手机号,会骂人,但是平台为了和谐,不允许展示这些内容,所以我们需要检测这些内容并做一些处理。如果是传统方式去做,可能就用if-else一个一个去判断,如果要检测的规则非常多,那就会有很多的if-else,代码很臃肿,并且不符合开闭原则。不方便维护和扩展,此时就可以考虑用责任链模式。
示意图
优点
把每个规则单独封装为一个类,每个类有自己的职责,符合设计原则的单一职责,,但需要新增规则的时候,只需要新增一个规则类即可,不影响之前的类,符合设计原则的开闭原则。
代码实例
目录结构
Check.php 抽象检测类
<?php
/**
* 抽象检测器类
* Class Filter
*/
abstract class Check{
public $filter;
/**
* 设置下一个检测器
* @param Check $filter
*/
function setCheck(Check $filter){
$this->filter= $filter;
}
/**
* 检测规则
* @param $message
* @return mixed
*/
abstract function doCheck($message);
}
PhoneCheck.php 手机号检测类
<?php
/**
* 手机号检测器,中间四位加*
* Class PhoneCheck
*/
class PhoneCheck extends Check{
public function doCheck($message)
{
// TODO: Implement doFilter() method.
$message = preg_replace("#(1[3|5|7|8]\d)\d{4}(\d{4})#","$1****$2",$message);
if ($this->check){
$this->check->doCheck($message);
}else{
echo $message;
}
}
}
StrictCheck.php 严禁词汇检测类
<?php
/**
* 严禁词汇检测器
* Class StrictCheck
*/
class StrictCheck extends Check{
public function doCheck($message)
{
// TODO: Implement doFilter() method.
$strictArr = ["程序员"];
foreach ($strictArr as $v){
if (strpos($message,$v)){
echo "不能包含敏感词汇<br>";
return false;
}
}
if ($this->check){
$this->check->doCheck($message);
}else{
echo $message;
}
}
}
WarningCheck.php 警告词汇检测类
<?php
/**
* 警告词汇检测器类,警告词汇加*
* Class WarningCheck
*/
class WarningCheck extends Check {
public function doCheck($message)
{
// TODO: Implement doFilter() method.
$strictArr = ["毛发","肩周炎"];
foreach ($strictArr as $v){
$message = str_replace($v,'*',$message);
}
if ($this->check){
$this->check->doCheck($message);
}else{
echo $message;
}
}
}
client.php 调用
<?php
require_once 'Check.php';
require_once 'PhoneCheck.php';
require_once 'StrictCheck.php';
require_once 'WarningCheck.php';
$message1 = "我手机号15799999999,是一个程序员,毛发旺盛,没肩周炎<br>";
$message2 = "我手机号15799999999,是一个chengxuyuan,毛发旺盛,没肩周炎<br>";
$phoneCheck = new PhoneCheck();
$strictCheck = new StrictCheck();
$warningCheck = new WarningCheck();
$phoneCheck->setCheck($strictCheck);
$strictCheck->setCheck($warningCheck);
echo "message1:";
$phoneCheck->doCheck($message1);
echo "message2:";
$phoneCheck->doCheck($message2);
由于message中有敏感词,审核过不了,只能放图片
运行结果