设计模式之责任链模式

package com.atshiyou.dp.cor;

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        Msg msg = new Msg();
        msg.setMsg("大家好:),<script> 你们一辈子都是996 ");


        List<Filter> filters = new ArrayList<>();
        filters.add(new HTMLFilter());
        filters.add(new SensitiveFilter());

        for (Filter f: filters){
            f.doFilter(msg);
        }
        System.out.println(msg);


    }
}

class Msg{
    String name;
    String msg;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    @Override
    public String toString() {
        return "Msg{" +
                "msg='" + msg + '\'' +
                '}';
    }
}


interface Filter{
    void doFilter(Msg m);
}

class HTMLFilter implements  Filter{

    @Override
    public void doFilter(Msg m) {

        String r = m.getMsg();
        r = r.replace('<', '[');
        r = r.replace('>', ']');
        m.setMsg(r);
    }
}

class SensitiveFilter implements Filter{

    @Override
    public void doFilter(Msg m) {
        String r = m.getMsg();
        r = r.replaceAll("996","995");
        m.setMsg(r);
        

    }
}

代码分析:

msg经过两次filter 的过滤,然后最终才输出

f1 ,f2 f3 串成一条链,每个f都有自己的责任,所以叫责任链模式

 

 

修改上面的代码:增加这么一个链条的类

主函数的代码就变成了

我们再加一个小技巧,发现这里要两次add 不方便

修改链条的函数

主函数可以写成:

 

继续添加 过滤器filter,我们想生成两个链条

我们现在主函数的代码为:

 

我们发现要使用 两次dofilter()不方便,继续修改代码:

让链条链继承filter接口,让FilterChain也变成filter,我们就可以将另外一个链条链加入当前链条了

主函数变成:将fc2 加入到fc链条中,前提是 链条也应该继承filter

 

继续新的业务需求:

我们希望在进行过滤时,判断msg中有敏感词的时候,直接退出过滤,不将数据存在数据库里了

代码实现:

interface Filter{
    boolean doFilter(Msg m);
}

//每个链条完成不同的业务(责任)
class HTMLFilter implements  Filter{

    @Override
    public boolean doFilter(Msg m) {

        String r = m.getMsg();
        r = r.replace('<', '[');
        r = r.replace('>', ']');
        m.setMsg(r);
        return true; // 简单起见就直接返回真
    }
}
//有敏感词直接返回false,其余过滤器直接返回true,暂不做判断
class SensitiveFilter implements Filter{

    @Override
    public boolean doFilter(Msg m) {
        String r = m.getMsg();
        r = r.replaceAll("996","995");
        m.setMsg(r);
        m.setMsg(r);
        return false;

    }
}
class FaceFilter implements Filter{

    @Override
    public boolean doFilter(Msg m) {
        String r = m.getMsg();
        r = r.replace(":)","^U^");
        m.setMsg(r);
        return true;

    }
}
class URLFilter implements Filter{

    @Override
    public boolean doFilter(Msg m) {
        String r = m.getMsg();
        r = r.replace("baidu.com","www.baidu.com");
        m.setMsg(r);
        return true;

    }
}

class FilterChain implements Filter{

    List<Filter> filters = new ArrayList<>();

    public FilterChain add(Filter filter){
        filters.add(filter);
        return this;
    }
    public boolean doFilter(Msg m){
        for (Filter f: filters){
            if(!f.doFilter(m)) return false;
        }
        return  true;



    }
}

我们将filter接口的返回值设定为boolean,void都要修改为boolean,在敏感词判断的地方直接返回false,就不需要继续执行了

主要是这里的代码:就是实现 当进行过滤器处理的时候,判断到有敏感词就返回false

执行结果:只替换饿了 <> 和 996 其余两个过滤器直接就没有实现

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

你在狗叫什么、

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

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

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

打赏作者

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

抵扣说明:

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

余额充值