一篇了解责任链模式

 

本文转载自微信公众号「我好困啊」,篇解作者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 */ 4public interface Seter<T> {  5 6    //设置参数 7    void doSet(T request); 8} 

ID组装器

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

name组装器

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

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

1/** 2 * 责任链模式(抽象责任链,可定义多种链) 3 */ 4public interface Chain<T> {  5 6    //组装 7    void assemble(T request); 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 */  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} 网站模板
数据库
上一篇:tk域名是什么域名?新手对tk域名有什么看法?
下一篇:为什么现在中文域名觉得好?使用中文域名有什么好处?