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("添加多选题");
        }
    }
}

责任链模式核心概念为多个实现类实现同一个接口
java设计模式之责任链模式(过滤器模式)_第1张图片
git地址:
https://github.com/hewenping/Filter

你可能感兴趣的:(每天一个知识点,java)