java设计模式-责任链设计模式

Posted 风某人~Wind

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java设计模式-责任链设计模式相关的知识,希望对你有一定的参考价值。

责任链模式是系统设计里面的一种程序设计模式,他包含了一系列的请求对象和处理对象,每一个处理对象他知道他能处理哪些请求对象,也能知道他该不该把这个请求对象传给下一个处理对象,他就是一条链路,链路上都是一个个的处理对象。

这种程序设计模式适用于

1. 审批流程,审批级别较多,不同级别审批不同的事项。

2. 一个请求需要多个处理对象的场景

下面代码演示了一个场景,当用户发布了一篇博客,平台需要进行一系列的操作进行审核,比如说需要对非法字符,文章中的恶意脚本进行转义,文章中的图片进行审核,还有防sql注入等操作进行审核。

代码如下:

定义一个消息处理基类


/**
 * @Auther: wan
 * @Date: 2022/8/23 10:53
 * @Description: 消息处理器基类
 * @version: 1.0
 */
public interface MessageHandle 

    /**
     * 执行器
     */
    void  doFilter(MessageRequest moneyRequest);

    /**
     * 下一个执行器
     */
    MessageHandle getHandle();

    /**
     * 设置执行器
     */
    void  setHandle(MessageHandle moneyHandle);

    /**
     * 优先级
     */
    int getPriority();

消息请求实体

/**
 * @Auther: wan
 * @Date: 2022/8/14 10:56
 * @Description: 消息请求实体
 * @version: 1.0
 */
@Data
public class MessageRequest 

    /**
     * 请求消息内容
     */
    private String message;

    /**
     * 创作人名称
     */
    private String  name;

处理对象实现类

  防SQL注入转义处理器

/**
 * @Auther: wan
 * @Date: 2022/8/23 14:27
 * @Description: 防SQL注入转义处理器
 * @version: 1.0
 */
public class DefenseSQLInjectionHandle implements MessageHandle 
    /**
     * 下一个处理器
     */
    private MessageHandle moneyHandle;
    /**
     * 名称
     */
    private String name;

    public DefenseSQLInjectionHandle(String name)
        this.name = name;
    
    @Override
    public void doFilter(MessageRequest messageRequest) 
        String message = messageRequest.getMessage();

        /**
         * 1. sql转义
         */
        message = message.replaceAll("delete","");
        message = message.replaceAll("update ","");
        messageRequest.setMessage(message);
        System.out.println("消息:【"+messageRequest.getMessage()+"】,处理器:【"+name+"】");
        //还可以设置条件让他结束。
        if (null == getHandle())
            return;
        
        getHandle().doFilter(messageRequest);
    
    @Override
    public void setHandle(MessageHandle moneyHandle) 
        this.moneyHandle = moneyHandle;
    

    @Override
    public int getPriority() 
        return 1;
    

    @Override
    public MessageHandle getHandle() 
        return this.moneyHandle;
    

特殊字符转义处理器
/**
 * @Auther: wan
 * @Date: 2022/8/23 12:14
 * @Description: 特殊字符转义处理器
 * @version: 1.0
 */
public class SpecialCharacterHandle implements MessageHandle 
    /**
     * 下一个处理器
     */
    private MessageHandle moneyHandle;
    /**
     * 名称
     */
    private String name;

    public SpecialCharacterHandle(String name)
        this.name = name;
    

    @Override
    public void doFilter(MessageRequest messageRequest) 
        String message = messageRequest.getMessage();

        /**
         * 1. 特殊字符转义,在这里只是举例子
         */
        message = message.replaceAll("<","[");
        message = message.replaceAll(">","]");

        messageRequest.setMessage(message);
        System.out.println("消息:【"+messageRequest.getMessage()+"】,处理器:【"+name+"】");
        if (null == getHandle())
            return;
        
        getHandle().doFilter(messageRequest);
    

    @Override
    public void setHandle(MessageHandle moneyHandle) 
        this.moneyHandle = moneyHandle;
    

    @Override
    public int getPriority() 
        return 0;
    

    @Override
    public MessageHandle getHandle() 
        return this.moneyHandle;
    

还可以自己自定义处理器,可以自己自定义扩展一些逻辑

自定义处理器
/**
 * @Auther: wan
 * @Date: 2022/8/23 11:05
 * @Description:  自定义处理器
 * @version: 1.0
 */
public class CustomHandle implements MessageHandle 

    /**
     * 下一个处理器
     */
    private MessageHandle moneyHandle;
    /**
     * 名称
     */
    private String name;

    /**
     * 构造方法
     * @param
     */
    public CustomHandle(String name)
        this.name = name;
    

    /**
     * 执行逻辑方法
     * @param messageRequest
     */
    @Override
    public void doFilter(MessageRequest messageRequest) 
        //获取消息
        String message = messageRequest.getMessage();

        /**
         * 自定义处理器
         * 1. 把一些比较重伤人的脏话转义一下
         */
        message = message.replaceAll("傻杯","**");
        /**
         * 可以对消息进行自定义操作。
         */
        if (message.indexOf("沙雕") > -1)
            System.out.println("审核不通过,内容带有敏感字:【沙雕】");
            return;
        

        messageRequest.setMessage(message);
        System.out.println("消息:【"+messageRequest.getMessage()+"】,处理器:【"+name+"】");

        if (null == getHandle())
            return;
        
        getHandle().doFilter(messageRequest);
    
    @Override
    public void setHandle(MessageHandle moneyHandle) 
        this.moneyHandle = moneyHandle;
    

    @Override
    public int getPriority() 
        return 10;
    

    @Override
    public MessageHandle getHandle() 
        return this.moneyHandle;
    

测试类

根据优先级高低对消息进行依次处理。

/**
 * @Auther: wan
 * @Date: 2022/8/14 15:10
 * @Description: 测试类
 * @version: 1.0
 */
public class Main 


    private void Test02(MessageRequest moneyRequest)

        List<MessageHandle> MessageList = new ArrayList<>();
        SpecialCharacterHandle specialCharacterHandle = new SpecialCharacterHandle("特殊字符转义处理器");
        DefenseSQLInjectionHandle defenseSQLInjectionHandle = new DefenseSQLInjectionHandle("防SQL注入转义处理器");
        CustomHandle customHandle  = new CustomHandle("自定义处理器");

        MessageList.add(specialCharacterHandle);
        MessageList.add(defenseSQLInjectionHandle);
        MessageList.add(customHandle);

        //对优先级进行排序
        List<MessageHandle> list = MessageList.stream().sorted(new Comparator<MessageHandle>() 
            @Override
            public int compare(MessageHandle o1, MessageHandle o2) 
                if (o1.getPriority() > o2.getPriority())
                    return o2.getPriority();
                 else 
                    return o1.getPriority();
                
            
        ).collect(Collectors.toList());
        System.out.println(list);

        MessageHandle handle = null;
        for (int i = 0; i < list.size(); i++) 
            //先赋值
            if (null == handle)
                handle = list.get(i);
            
            if (i < (list.size()-1))
                list.get(i).setHandle(list.get(i+1));
            
        
        list.get(0).doFilter(moneyRequest);
    

    public static void main(String[] args) 
        MessageRequest moneyRequest = new MessageRequest();
        moneyRequest.setMessage("大家好!<script>alter('xxoo')</script>,傻杯!!!");
        moneyRequest.setName("风某人");
        Main main = new Main();
        main.Test02(moneyRequest);
    

以上是关于java设计模式-责任链设计模式的主要内容,如果未能解决你的问题,请参考以下文章

JAVA设计模式之责任链模式

Java设计模式责任链模式 命令模式

JAVA设计模式之责任链模式

java责任链模式及项目实际运用

java责任链设计模式(功能链)

Java 设计模式之责任链学习与掌握