设计模式之责任链模式(行为型)

news/2024/5/19 13:26:41 标签: 设计模式, 责任链模式, java

1、责任链模式定义

链是什么?

链是一系列节点的集合,各个节点可以灵活的拆分重组

责任链模式

责任链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这个对象连成一条线,并沿着这条链传递该请求,知道有一个对象处理它为止

2、责任链模式结构

在这里插入图片描述
Handler:抽象处理者角色:定义一个处理请求的接口,接口可以定义一个方法来设置和返回后续处理者的引用

java">import lombok.Data;

/**
 * 抽象处理者
 */
@Data
public abstract class Handler {

    /**
     * 后续的处理对象
     */
    protected Handler successor;

    /**
     * 处理请求的方法,可以按照具体要求来选择是否传递参数
     */
    public abstract void handlerRequest();

}

ConcreteHandler:具体处理者角色:具体处理者收到请求可选择处理请求或者将请求传递给下一个处理者

java">/**
 * 具体处理者 A
 * 传入参数小于等于 10 进行处理,否则由下一个处理者处理
 */
public class ConcreteHandlerA extends Handler {

    @Override
    public void handlerRequest(Integer num) {
        if (num <= 10) {
            System.out.println("ConcreteHandlerA 对请求进行处理");
        } else {
            successor.handlerRequest(num);
        }

    }

}


/**
 * 具体处理者 B
 * 传入参数大于 20 进行处理,否则由下一个处理者处理
 */
public class ConcreteHandlerB extends Handler {

    @Override
    public void handlerRequest(int num) {
        if (num > 10 && num <= 15) {
            System.out.println("ConcreteHandlerB 对请求进行处理");
        } else {
            successor.handlerRequest(num);
        }

    }

}



/**
 * 默认处理者
 */
public class DefaultHandler extends Handler {

    @Override
    public void handlerRequest(int num) {
        System.out.println("DefaultHandler 对请求进行处理");
    }

}

调用方代码

java">public class HandlerClient {

    public static void main(String[] args) {
        // 组装责任链
        ConcreteHandlerA concreteHandlerA = new ConcreteHandlerA();
        ConcreteHandlerB concreteHandlerB = new ConcreteHandlerB();
        DefaultHandler defaultHandler = new DefaultHandler();
        concreteHandlerA.setSuccessor(concreteHandlerB);
        concreteHandlerB.setSuccessor(defaultHandler);

        int[] requests = {-1, 0, 1, 11, 15, 19};

        for (int request : requests) {
            concreteHandlerA.handlerRequest(request);
        }
        // ConcreteHandlerA 对请求进行处理,num = -1
		// ConcreteHandlerA 对请求进行处理,num = 0
		// creteHandlerA 对请求进行处理,num = 1
		// creteHandlerB 对请求进行处理,num = 11
		// creteHandlerB 对请求进行处理,num = 15
		// aultHandler 对请求进行处理,num = 19

    }

}

3、责任链模式特点

  • 当用户提交请求时,请求沿链传递知道有一个 ConcreteHandler 对请求进行处理
  • 接收者和发送者都没有对方的明确信息,链中的对象也不知道链的组成结构,简化了对象的互相连接,仅需要保持一个指向后续处理者的引用即可
  • 责任链模式需要进行正确的配置,否则可能会出现一个请求到了链的末端都没有被处理,需要存在一个默认的兜底逻辑

http://www.niftyadmin.cn/n/817899.html

相关文章

如何使用Rust提高Ruby性能

Ruby是一种简单快捷面向对象的脚本语言&#xff0c;而Rust是一种系统编程语言&#xff0c;它有着惊人的运行速度&#xff0c;能够防止段错误&#xff0c;并保证线程安全。本文作者以项目为例&#xff0c;结合大量的编程代码描述了如何借助Rust语言提高Ruby的性能&#xff0c;以…

包装简历后拿到20K月薪,但…

2015年5月25日晚上&#xff0c;有位关注我订阅号“程序视界”的朋友发了条消息给我&#xff1a; 由于工作越来越难找&#xff0c;下面两个问题越来越让IT培训机构的学员们头疼&#xff1a; 简历到底如何包装面试是否应该实话实说 当时我通过公众号后台回复他了下面的话&#…

购物车的实现原理

购物网中购物车的实现原理 购物车相当于现实中超市的购物车&#xff0c;不同的是一个是实体车&#xff0c;一个是虚拟车而已。用户可以在购物网站的不同页面之间跳转&#xff0c;以选购自己喜爱的商品&#xff0c;点击购买时&#xff0c;该商品就自动保存到你的购物车中&#x…

C++11 | range-based for loop

C11里支持range-based for loop了&#xff0c;到这里可以看到完整的语法及示例&#xff1a;http://en.cppreference.com/w/cpp/language/range-for。英文的&#xff0c;我用中文演绎一下。 range-based for loop的基本语法如下&#xff1a; for ( range_declaration : range_e…

Java虚拟机垃圾回收(二) :垃圾回收算法(转载)

1、标记-清除算法 标记-清除&#xff08;Mark-Sweep&#xff09;算法是一种基础的收集算法。 1、算法思路 "标记-清除"算法&#xff0c;分为两个阶段&#xff1a; &#xff08;A&#xff09;、标记 首先标记出所有需要回收的对象&#xff1b; 标记过程如《Java虚拟机…

为什么很多公司不要培训机构出来的程序员?

近几年&#xff0c;互联网创业潮让IT技术人员的需求大大增加&#xff0c;各类IT培训机构风生水起&#xff0c;办得如火如荼。然而&#xff0c;一些公司却招聘网站上写着”没有上过培训班的优先。“为什么会有这样的区别对待呢? 经过调查发现&#xff0c;培训机构出来的程序员被…

剑指offer——序列化二叉树

序列化二叉树 请实现两个函数&#xff0c;分别用来序列化和反序列化二叉树 在序列化二叉树时&#xff0c;可以使用二叉树遍历的递归版本&#xff0c;也可以使用迭代版本&#xff0c;而且先序遍历&#xff0c;中序遍历&#xff0c;后序遍历和层序遍历都可以实现&#xff0c;但是…

缺这两点的Scrum注定失败(送书)

很多软件公司&#xff0c;在遇到产品交付延期、开发周期长、产品质量低下、运维成本高、响应需求慢等等问题时&#xff0c;会尝试引入敏捷来改善。然而&#xff0c;大多数公司的老板和管理者&#xff0c;从一开始就是错的&#xff0c;就注定要失败——因为他们本末倒置&#xf…