java设计模式之责任链模式(过滤器模式)

责任链概念:使多个对象都有机会处理同一个请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
项目中实际应用场景:当一条数据需要经过不同接口进行处理,利用责任链模式可进行解耦灵活添加不同接口。
例如 oa中请假 张三请假天数不同需要经过不同领导审批。

下面以一张考卷添加不同类型试题为demo来展示责任链模式
main方法


```java
package bjsxt.dp.paper;

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

/**
 * @author hwp
 * @PACKAGE_NAME: bjsxt.dp.paper
 * @company:小清新
 * @USER:小清新
 * @date: 2021年03月19日 13:32
 * @PROJECT_NAME: test
 **/
public class TestPaper {
    /**
     * 生成试卷将不同试题插入数据库
     * */
    public static void main(String[] args) {
        String [] problemList={"单选","多选","简答"};
        for (String questionType:problemList) {
           PaperFilter pf=new  PaperFilter();
           FilterChain fc=new FilterChain();
           fc.addFilter(new CheckBoxFilter());
           fc.addFilter(new AnswerFilter());
           fc.addFilter(new SingleChoiceFilter());
           pf.setQuestionType(questionType);
           pf.setFilterChain(fc);
           pf.fillPaper();
        }
    }
}

实体类

package bjsxt.dp.paper;

import lombok.Data;

/**
 * @author hwp
 * @PACKAGE_NAME: bjsxt.dp.paper
 * @company:小清新
 * @USER:小清新
 * @date: 2021年03月19日 13:37
 * @PROJECT_NAME: test
 **/
@Data
public class PaperFilter {
    private String  questionType;
    FilterChain filterChain;
    public void fillPaper(){
        filterChain.doFilter(questionType);
    }
}

进入责任链接口(也可理解为责任链容器)

package bjsxt.dp.paper;

/**
 * @author hwp
 */
public interface Filter {
    /***
      *传入问题类型 进入责任链
      *@param questionType
      *@return: void 
      *@author: 小清新
      *@Date: 2021/3/19 
     **/
    void doFilter(String  questionType);
}

FilterChain接口用来动态添加规则

package bjsxt.dp.paper;

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

/**
 * @author hwp
 * @PACKAGE_NAME: bjsxt.dp.paper
 * @company:小清新
 * @USER:小清新
 * @date: 2021年03月19日 13:49
 * @PROJECT_NAME: test
 **/

public class FilterChain implements Filter{
    List<Filter> filterList=new ArrayList<Filter>();
    public List<Filter> addFilter(Filter filter){
        this.filterList.add(filter);
        return filterList;
    }
    @Override
    public void doFilter(String questionType) {
        for (Filter ft:filterList) {
            ft.doFilter(questionType);
        }
    }
}

规则接口一

package bjsxt.dp.paper;

/**
 * @author hwp
 * @PACKAGE_NAME: bjsxt.dp.paper
 * @company:小清新
 * @USER:小清新
 * @date: 2021年03月19日 14:32
 * @PROJECT_NAME: test
 **/

public class AnswerFilter implements Filter{
    @Override
    public void doFilter(String questionType) {
        if(questionType.equals("多选")){
            System.out.println("添加简单题");
        }
    }
}

规则接口二

package bjsxt.dp.paper;

/**
 * @author hwp
 * @PACKAGE_NAME: bjsxt.dp.paper
 * @company:小清新
 * @USER:小清新
 * @date: 2021年03月19日 14:01
 * @PROJECT_NAME: test
 **/
public class CheckBoxFilter implements Filter{
    @Override
    public void doFilter(String questionType) {
        if(questionType.equals("多选")){
            System.out.println("添加多选题");
        }
    }
}

责任链模式核心概念为多个实现类实现同一个接口
在这里插入图片描述
git地址:
https://github.com/hewenping/Filter

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值