Java设计模式

Java实现23种设计模式(六):责任链模式(重点掌握)

2020-06-10  本文已影响0人  依然慢节奏

二十三种设计模式分类

设计模式三大分类.jpg

一、概述

责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

在责任链模式中,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递过程,所以责任链将请求的发送者和请求的处理者解耦了。

优点

缺点

场景

1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
3、可动态指定一组对象处理请求。


二、实现

1. 结构图

职责链模式主要包含以下角色:

PS:UML结构图可以参考,例子实现并不根据UML图来完成,灵活实现即可;

2. 实现

package cn.missbe.model.responsibilityChain.filter;

/**
 * Copyright (c) 2020.
 * Email: love1208tt@foxmail.com
 * @author lyg  2020/4/27 下午7:21
 * description:
 * 责任链模式:具体的Filter
 **/

public interface Filter {
    boolean doFilter(Message msg);
}
/**笑脸过滤器*/
public class FaceFilter implements Filter {
    @Override
    public boolean doFilter(Message msg) {
        msg.setMsg(msg.getMsg().replace(":(", "^_^"));
        return true;
    }
}
/**Html字符过滤器*/
public class HtmlFilter implements  Filter {
    @Override
    public boolean doFilter(Message msg) {
        msg.setMsg(msg.getMsg().replaceAll("<","["));
        msg.setMsg(msg.getMsg().replaceAll(">","]"));
        return true;
    }
}
/**敏感词过滤器*/
public class SensitiveFilter implements Filter {
    @Override
    public boolean doFilter(Message msg) {
        if (msg.getMsg().contains("996")) {
            return false;
        }
        return true;
    }
}
package cn.missbe.model.responsibilityChain.filter;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * Copyright (c) 2020.
 * Email: love1208tt@foxmail.com
 * @author lyg  2020/4/27 下午7:33
 * description:
 * 过滤器链
 **/

public class FilterChain {
    private List<Filter> filterChain = new ArrayList<>();

    public FilterChain registerFilter(Filter filter) {
        filterChain.add(filter);
        return this;
    }

    public boolean doFilter(Message msg){
        for (Filter filter : filterChain) {
            if (!filter.doFilter(msg)) {
                return false;
            }
        }
        return true;
    }
}
package cn.missbe.model.responsibilityChain.filter;

/**
 * Copyright (c) 2020.
 * Email: love1208tt@foxmail.com
 * @author lyg  2020/4/27 下午7:30
 * description:
 * 责任链模式
 **/

public class Main {
    public static void main(String[] args) {
        Message message = new Message();
        message.setMsg("过滤器测试,<script>笑脸:(,这是一个敏感词996.</script>");
        FilterChain filterChain = new FilterChain();
        filterChain.registerFilter(new HtmlFilter()).registerFilter(new FaceFilter()).registerFilter(new SensitiveFilter());
        filterChain.doFilter(message);
        System.out.println(message);
    }
}
上一篇下一篇

猜你喜欢

热点阅读