设计模式之责任链模式

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

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

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

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

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

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

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

/**
 * @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);  //新增的代码

在这里插入图片描述

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

posted @ 2022-04-05 07:12  伟衙内  阅读(18)  评论(0编辑  收藏  举报