设计模式之建造者模式

职责链模式

定义

将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。

多个处理器依次处理同一个请求。一个请求先经过A处理器处理,然后再把请求传递给B处理器,B处理完后传递给C,以此类推,形成一个链条。链条上的每个处理器各自承担各自的处理职责。职责链模式实现有多种。

类图

在这里插入图片描述

实现

实现一个敏感词过滤。

1. 定义过滤算法接口

public interface SensitiveWordFilter {
    boolean doFilter(Content content);
}

2. 定义过滤算法实现类

/**
 * 敏感词过滤一
 */
public class SexyWordFilter implements SensitiveWordFilter{
    @Override
    public boolean doFilter(Content content) {
        if (content.content.contains("性")) {
            return false;
        }
        return true;
    }
}
/**
 * 敏感词过滤二
 */
public class PoliticalWorldFilter implements SensitiveWordFilter{
    @Override
    public boolean doFilter(Content content) {
        if (content.content.contains("政治")) {
            return false;
        }
        return true;
    }
}

3. 创建Filter Chain

/**
 * 通过集合保存过滤算法
 * 暴露filter执行敏感词过滤。这只是其中的职责链的变种。
 */
public class SenstiveWordFilterChain {
    private List<SensitiveWordFilter> filterList = new ArrayList<>();
    public void addWordFilter(SensitiveWordFilter filter) {
        this.filterList.add(filter);
    }

    public boolean filter(Content content) {
        for (SensitiveWordFilter sensitiveWordFilter : filterList) {
            if (!sensitiveWordFilter.doFilter(content)) {
                return false;
            }
        }
        return true;
    }
}

4. Main

/**
 * 1. 职责链模式很好体现单一职责原则。业务逻辑判断 设计成独立的类,通过接口方便扩展。
 * 2. 职责链模式也体现开闭原则。如果需要新添加过滤算法,我们只需要实现Filter接口,并通过addWordFitler添加到职责链即可。其它代码不需要修改,进而提高代码的扩展性。
 */
public class M {
    public static void main(String[] args) {
        SenstiveWordFilterChain senstiveWordFilterChain = new SenstiveWordFilterChain();
        senstiveWordFilterChain.addWordFilter(new PoliticalWorldFilter());
        senstiveWordFilterChain.addWordFilter(new SexyWordFilter());
        Content content = new Content();
        content.content = "2333";
        boolean filter = senstiveWordFilterChain.filter(content);
        if (filter) {
            System.out.println("可以正常发布");
        } else {
            System.out.println("不允许发布。因为包含敏感信息!");
        }
    }
}

总结

  1. 职责链很好地符合单一职责原则(每个算法都是独立的实现)开闭原则(扩展算法不需要修改其他代码,只需要修改客户端代码。也可以在类中做标记,比如实现某个标记接口,然后通过Spring的Bean扫描并装载到职责链内)
  2. 职责链本意是依次处理同一个请求,用户可以自定义该请求是否需要经历所有处理器,不会中途停止; 还是说当某个处理器有能力处理请求就完成职责链对该请求的处理。
  3. 职责链具有复用扩展能力。在实际的项目开发中比较常用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值