一篇了解责任链模式

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

 [[411174]]

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

责任链模式:

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

意图

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

主要解决

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

关键代码

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

优点

1.降低了耦合

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

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

使用场景

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

示例图:

具体实现

创建用户类

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

创建各种组装器

1/** 
2 * 组装器(处理者) 
3 */ 
4public interface Seter<T> { 

6    //设置参数 
7    void doSet(T request); 
8} 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

ID组装器

1/** 
2 * ID 组装器 
3 */ 
4public class IdSeter implements Seter<User>{ 

6    @Override 
7    public void doSet(User user) { 
8        user.setId(1); 
9    } 
0} 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

name组装器

1/** 
2 *  
3 * name 组装器 
4 */ 
5public class NameSeter implements Seter<User>{ 

7    @Override 
8    public void doSet(User user) { 
9        user.setName("mengxin"); 
0    } 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

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

1/** 
2 * 责任链模式(抽象责任链,可定义多种链) 
3 */ 
4public interface Chain<T> { 

6    //组装 
7    void assemble(T request); 

9} 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

用户责任链

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

测试调用

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

MVCC数据库RR

2022-12-19 08:14:30

注解开发配置

2021-05-20 06:57:16

RabbitMQ开源消息

2012-03-28 13:28:56

Java设计模式

2022-12-28 08:08:57

2021-12-24 07:50:45

责任链模式设计

2024-01-30 13:15:00

设计模式责任链

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攻击防范

2022-06-08 00:10:33

数据治理框架

2023-05-12 08:19:12

Netty程序框架
点赞
收藏

51CTO技术栈公众号