责任链模式(Chain Responsibility)

发布于:2025-02-10 ⋅ 阅读:(35) ⋅ 点赞:(0)

一、定义:属于行为型设计模式,包含传递的数据、创建处理的抽象和实现、创建链条、将数据传递给顶端节点;

二、UML图

三、实现

1、需要传递处理的数据类

import java.util.Date;

/**
 * 需要处理的数据信息
 */
public class RequestData {

    private Long id;

    private String message;

    private Date date;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    @Override
    public String toString() {
        return "RequestData{" +
                "id=" + id +
                ", message='" + message + '\'' +
                ", date=" + date +
                '}';
    }
}

2、抽象处理类(也可以是接口)

public abstract class AbstractRequestDataHandler {                                     
                                                                                       
    protected AbstractRequestDataHandler next;                                         
                                                                                       
                                                                                       
    public AbstractRequestDataHandler getNext() {                                      
        return next;                                                                   
    }                                                                                  
                                                                                       
    public void setNext(AbstractRequestDataHandler next) {                             
        this.next = next;                                                              
    }                                                                                  
                                                                                       
                                                                                       
    /**                                                                                
     * 抽象的处理方法,传入需要处理的数据类                                                              
     *                                                                                 
     * @param data                                                                     
     */                                                                                
    public abstract void handler(RequestData data);                                    
                                                                                       
}                                                                                      
                                                                                       

3、具体处理实现


public class RequestDataHandlerA extends AbstractRequestDataHandler {


    @Override
    public void handler(RequestData data) {
        System.out.println("处理类A!");
        String message = data.getMessage().replace("A", "");
        data.setMessage(message);
        if (next != null) {
            next.handler(data);
        } else {
            System.out.println("终止执行");
        }
    }
}
public class RequestDataHandlerB extends AbstractRequestDataHandler {

    @Override
    public void handler(RequestData data) {
        System.out.println("处理类B!");
        String message = data.getMessage().replace("B", "");
        data.setMessage(message);
        if (next != null) {
            next.handler(data);
        } else {
            System.out.println("终止执行");
        }
    }
}

public class RequestDataHandlerC extends AbstractRequestDataHandler {

    @Override
    public void handler(RequestData data) {
        System.out.println("处理类C!");
        String message = data.getMessage().replace("C", "");
        data.setMessage(message);
        if (next != null) {
            next.handler(data);
        } else {
            System.out.println("终止执行");
        }
    }
}

4、客户端

public class ChainResponsibilityClient {

    public static void main(String[] args) {
        AbstractRequestDataHandler handler1 = new RequestDataHandlerA();
        AbstractRequestDataHandler handler2 = new RequestDataHandlerB();
        AbstractRequestDataHandler handler3 = new RequestDataHandlerC();

        //生成调用链条
        handler1.setNext(handler2);
        handler2.setNext(handler3);

        //把数据交给handler1处理即可,不需要关心h2和h3怎么处理的
        RequestData requestData = new RequestData();
        requestData.setMessage("ABCDE");
        handler1.handler(requestData);

        System.out.println(requestData.getMessage());
    }
}

四、责任链模式需要注意的地方

1、循环调用,比如下列代码会造成循环调用:

  //生成调用链条
        handler1.setNext(handler2);
        handler2.setNext(handler3);
        handler3.setNext(handler1);

2、链条太长可能会导致的性能问题

3、责任链的顶端和低端节点之间不应该存在耦合问题


网站公告

今日签到

点亮在社区的每一天
去签到