一篇了解责任链模式

开发 前端
定义一条加工链,请求发起者发起请求(原料),请求(原料)通过这条加工链进行一步步的处理后。输出最终的产品产出。

 [[411174]]

本文转载自微信公众号「我好困啊」,作者mengxin。转载本文请联系我好困啊公众号。

责任链模式:

定义一条加工链,请求发起者发起请求(原料),请求(原料)通过这条加工链进行一步步的处理后。输出最终的产品产出。

意图

请求的发起者和接收者,通过这条加工链条,进行解耦。将各种处理器进行连接,形成一条加工链条,请求一步步的进行传递,进行处理,直到处理完毕输出。

主要解决

职责链上的处理者负责处理请求,请求发起者将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递。

关键代码

将各种职责处理器进行一步步连接,组装成一条责任链。

优点

1.降低了耦合

2.简化了对象,使得对象不需要知道责任链的具体实现

3.增强给对象指派职责的灵活性。如新增一个职责只需要加处理器加工到链上即可。

使用场景

有多个对象可以处理同一个请求。比如:定义了一个用户对象,需要对这个用户对象进行一系列处理。那么可以将各种处理抽象成处理器,将各种处理器进行连接形成一条加工链。将对象送入到加工链上进行处理。

示例图:

具体实现

创建用户类

  1.  1/** 
  2.  2 * 用户对象,对其进行加工 
  3.  3 */ 
  4.  4@Data 
  5.  5@AllArgsConstructor 
  6.  6@NoArgsConstructor 
  7.  7public class User { 
  8.  8 
  9.  9    private int id; 
  10. 10 
  11. 11    private String name
  12. 12 
  13. 13} 

创建各种组装器

  1. 1/** 
  2. 2 * 组装器(处理者) 
  3. 3 */ 
  4. 4public interface Seter<T> { 
  5. 6    //设置参数 
  6. 7    void doSet(T request); 
  7. 8} 

ID组装器

  1. 1/** 
  2. 2 * ID 组装器 
  3. 3 */ 
  4. 4public class IdSeter implements Seter<User>{ 
  5. 6    @Override 
  6. 7    public void doSet(User user) { 
  7. 8        user.setId(1); 
  8. 9    } 
  9. 0} 

name组装器

  1. 1/** 
  2. 2 *  
  3. 3 * name 组装器 
  4. 4 */ 
  5. 5public class NameSeter implements Seter<User>{ 
  6. 7    @Override 
  7. 8    public void doSet(User user) { 
  8. 9        user.setName("mengxin"); 
  9. 0    } 

接下来定义责任链,将组装器连接起来

  1. 1/** 
  2. 2 * 责任链模式(抽象责任链,可定义多种链) 
  3. 3 */ 
  4. 4public interface Chain<T> { 
  5. 6    //组装 
  6. 7    void assemble(T request); 
  7. 9} 

用户责任链

  1.  1/** 
  2.  2 * 用户责任链 
  3.  3 */ 
  4.  4public class UserChain implements Chain<User>{ 
  5.  5 
  6.  6    private final List<Seter<User>> seters = new LinkedList<>(); 
  7.  7 
  8.  8    //初始化(组装责任链),注入seter处理器处理 
  9.  9    public UserChain(){ 
  10. 10        //注入id设置器 
  11. 11        seters.add(new IdSeter()); 
  12. 12        //注入名称设置器 
  13. 13        seters.add(new NameSeter()); 
  14. 14    } 
  15. 15 
  16. 16    /** 
  17. 17     * 用户责任链,调用seter,组装参数 
  18. 18     * @param request 
  19. 19     */ 
  20. 20    @Override 
  21. 21    public void assemble(User request) { 
  22. 22        seters.forEach(userSeter -> userSeter.doSet(request)); 
  23. 23    } 
  24. 24} 

测试调用

  1.  1/** 
  2.  2 * 责任链测试类 
  3.  3 */ 
  4.  4public class Test { 
  5.  5 
  6.  6 
  7.  7    public static void main(String[] args) { 
  8.  8        //用户责任链 
  9.  9        UserChain userChain = new UserChain(); 
  10. 10        User user = new User(); 
  11. 11        //调用责任链,设置参数 
  12. 12        userChain.assemble(user); 
  13. 13        //加工完后获取到的对象值 
  14. 14        System.out.println(user.getId()+","+user.getName()); 
  15. 15    } 
  16. 16} 

 

 

责任编辑:武晓燕 来源: 我好困啊
相关推荐

2021-07-28 10:02:54

建造者模式代码

2022-03-07 06:34:22

CQRS数据库数据模型

2022-11-01 08:46:20

责任链模式对象

2023-09-26 00:27:07

设计模式链接

2022-06-15 08:17:13

OA系统数据

2022-12-19 08:14:30

注解开发配置

2022-10-26 07:39:36

MVCC数据库RR

2021-05-20 06:57:16

RabbitMQ开源消息

2024-01-30 13:15:00

设计模式责任链

2021-12-24 07:50:45

责任链模式设计

2012-03-28 13:28:56

Java设计模式

2022-12-28 08:08:57

2021-07-10 09:02:42

编程语言 TypeScript

2021-10-28 19:15:02

IPUARM

2020-10-09 08:15:11

JsBridge

2023-06-16 07:41:36

分层架构软件架构

2024-12-03 15:52:45

责任链Java

2021-12-30 09:38:51

DDoS攻击防范

2021-06-30 00:20:12

Hangfire.NET平台

2023-05-12 08:19:12

Netty程序框架
点赞
收藏

51CTO技术栈公众号