设计模式之责任链模式

顾名思义,这是一个链式传递,将责任一层一层传递,最终找到背锅的那位。

提取关键词: 链式传递,最终者。

那么必然前面一位要知道怎么把这个锅传给后面一位,要是都不知道后面一位是谁,怎么传递责任。
在这里插入图片描述

如同上图一样,假如一个系统出问题了,总监问主任,主任找部长,部长找组长,组长最终让程序员找原因,这样层层传递。

找到原因后也可以一层层将原因汇报上去。
在这里插入图片描述

假如部长有天挂了,主任一直不问世事,压根不知道组长是谁,那么他这个责任就传递不下去了。
在这里插入图片描述

还是以短信举例,在发短信前肯定有一大堆过滤器,黑名单校验的,内容校验的。

/**
 * @author lw
 * @date 2022/3/31 0031
 * @description  号码过滤
 */
public class PhoneFilter implements CustomFilter {

    private CustomFilter filter;

    @Override
    public void setNextFilter(CustomFilter filter) {
        this.filter = filter;
    }

    @Override
    public boolean filter(SmsInfo info) {
        String blackPhone = "12306";//黑名单
        if(blackPhone.equals(info.fromPhone)||blackPhone.equals(info.toPhone)){
            System.out.println("PhoneFilter.filter");
            return true;
        }
        if(this.filter!=null){
            return this.filter.filter(info);
        }
        return false;
    }
}



/**
 * @author lw
 * @date 2022/3/31 0031
 * @description 内容过滤
 */
public class ContentFilter implements CustomFilter {

    private CustomFilter filter;

    @Override
    public void setNextFilter(CustomFilter filter) {
        this.filter = filter;
    }

    @Override
    public boolean filter(SmsInfo info) {
        if ("不法信息".equals(info.content)) {
            System.out.println("ContentFilter.filter");
            return true;
        }
        if (this.filter != null) {
            return this.filter.filter(info);
        }
        return false;
    }
}

调用者

ContentFilter contentFilter = new ContentFilter();
PhoneFilter phoneFilter = new PhoneFilter();
phoneFilter.setNextFilter(contentFilter);

//短信信息
SmsInfo info = new SmsInfo();
info.fromPhone = "1872671";
info.toPhone = "12306";
info.content = "hello world";
info.content = "不法信息";

boolean filter = phoneFilter.filter(info);
System.out.println(filter);

死循环

但是这里有一个注意点,曾经有这么一个人,写了如下的过滤,如下就形成了一个死循环。

ContentFilter contentFilter = new ContentFilter();
PhoneFilter phoneFilter = new PhoneFilter();
phoneFilter.setNextFilter(contentFilter);
contentFilter.setNextFilter(phoneFilter);  //新增的代码

在这里插入图片描述

上述的链式调用就会变成如图的循环,如此就是永无止境。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值