设计模式之责任链模式

什么是责任链模式

责任链就是把每个类的职责串联起来,一个接一个的执行,直到执行完为值。

使用场景

敏感词检测,用户发送一段信息,可能会有手机号,会骂人,但是平台为了和谐,不允许展示这些内容,所以我们需要检测这些内容并做一些处理。如果是传统方式去做,可能就用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中有敏感词,审核过不了,只能放图片

运行结果

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

对这是我的昵称

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值