设计模式之责任链模式

本文介绍了责任链模式,通过一个消息过滤的例子展示了如何使用该模式。在JavaScript时间冒泡、JavaWeb的编码处理、Servlet过滤器和Struts2拦截器中都能看到其应用。责任链模式降低了耦合度,简化了对象,并允许动态调整处理流程。然而,它可能导致请求未被处理,且调试时可能会有困难。代码示例中创建了一个消息处理器链,用于对消息进行HTML转义和敏感词汇替换处理。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本人对于设计模式的学习,仅供参考!


提示:以下是本篇文章正文内容,下面案例可供参考

一、责任链模式Chain of Responsibility

一个请求传过来,有多个对象负责进行处理由由每一个对象对其下家的引用而连接起来形成一条链。请求在链上传递,直到某一个对象决定处理此请求。发出请求的客户端,并不知道链上哪一个对象。最终处理这个请求,这使得系统可以在不影响客户端的情况下,动态重新组织和分配责任。

二、案例说明

1.介绍

使用场景:
JS中的时间冒泡,Java Web中的Tomcat对Encoding的处理,jsp servlet中的Filter,Struts2中的拦截器等。
优点:
1.降低耦合度,他将请求的接发送者和接收者解耦。
2.简化了对象,使得对象不需要知道链的结构。
3.增强给对象指派职责的灵活性。
4.增加新的请求处理类很方便。
缺点:
1.不能保证请求一定被接收。
2.系统性能将受到一定影响,且在代码调试时不太方便,可能造成循环调用。
3.可能不容易观察运行时特征,有碍于除错。

2.代码实现

我们用多个对象对Msg对象的信息描述进行处理。
Msg对象:

public class Msg {
    private String msg;
    private String name;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

处理器的抽象接口:

public interface Handle {
    boolean doFilter(Msg msg);
}

具体处理器类:

public class HTMLFilter implements Handle {
    @Override
    public boolean doFilter(Msg msg) {
        String m;
        //处理器处理Msg对象过程
        m=msg.getMsg().replace("<","[");
        m=m.replace(">","]");
        msg.setMsg(m);;
        return true;
    }
}
public class SensitiveFilter implements Handle {
    @Override
    public boolean doFilter(Msg msg) {
        //处理器处理Msg对象过程
        String m=msg.getMsg().replace("996","955");
        msg.setMsg(m);
        return true;
    }
}

处理器链条:

//实现了处理器接口
public class HandleChain implements Handle {
    //用来添加处理器
    List<Handle> filters=new ArrayList<>();
    @Override
    public boolean doFilter(Msg msg) {
        //把Msg对象交给链条中的处理器处理
        for (Handle filter : filters) {
            if (!filter.doFilter(msg)) return false;
        }
        return true;
    }
    //把处理器添加进filter中,链条也是处理器,使得处理器链条可以相互连接起来
    public HandleChain add(Handle filter){
        filters.add(filter);
        return this;
    }
}

代码测试:

public class Main {
    public static void main(String[] args) {
        //构建Msg对向
        Msg msg=new Msg();
        msg.setMsg("大家好!<script>欢迎来到996模式");
        //构建处理器
        Handle f1=new HTMLFilter();
        Handle f2=new SensitiveFilter();
        //将处理器添加进链条
        HandleChain handleChain=new HandleChain();
        HandleChain filterChain2=new HandleChain();
        handleChain.add(f1);
        filterChain2.add(f2);
        //链条可以相互连接
        handleChain.add(filterChain2);
        //把Msg交给处理器链条进行处理
        handleChain.doFilter(msg);
        System.out.println(msg.getMsg());//大家好![script]欢迎来到955模式
    }
}


总结

责任链模式的本质就是请求与处理,让请求在处理链中能进行传递与被处理,其独到之处就是将其节点处理者组合成了链式结构,并语序节点自身决定是否进行处理或转发,相当于让请求流动起来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值