【设计模式】责任链模式

发布于:2025-05-31 ⋅ 阅读:(20) ⋅ 点赞:(0)

责任链模式(Chain of Responsibility Pattern)

责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行传递,直到其中一个处理者能够处理该请求为止。这种模式使得多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。

一、责任链模式的定义

责任链模式的核心思想是将请求的处理者连成一条链,并沿着这条链传递请求,直到链中的某个处理者能够处理该请求为止。每个处理者都包含对下一个处理者的引用,如果当前处理者不能处理请求,它会将请求传递给下一个处理者。

二、责任链模式的结构

责任链模式主要包含以下几个角色:

• 抽象处理者(Handler):定义了一个处理请求的接口,通常包含一个指向下一个处理者的引用。

• 具体处理者(ConcreteHandler):实现抽象处理者接口的具体类,处理请求或将其传递给下一个处理者。

• 客户端(Client):发起请求的对象,通常不知道请求会被传递到哪个具体的处理者。

三、责任链模式的实现

以下是一个简单的实现示例:

1.抽象处理者

public abstract class Handler {
    protected Handler nextHandler;

    public void setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    public abstract void handleRequest(Request request);
}

2.具体处理者

public class ConcreteHandlerA extends Handler {
    @Override
    public void handleRequest(Request request) {
        if (request.getType() == RequestType.TYPE_A) {
            System.out.println("ConcreteHandlerA handles request: " + request.getDescription());
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

public class ConcreteHandlerB extends Handler {
    @Override
    public void handleRequest(Request request) {
        if (request.getType() == RequestType.TYPE_B) {
            System.out.println("ConcreteHandlerB handles request: " + request.getDescription());
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

public class ConcreteHandlerC extends Handler {
    @Override
    public void handleRequest(Request request) {
        if (request.getType() == RequestType.TYPE_C) {
            System.out.println("ConcreteHandlerC handles request: " + request.getDescription());
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

3.请求类

public class Request {
    private RequestType type;
    private String description;

    public Request(RequestType type, String description) {
        this.type = type;
        this.description = description;
    }

    public RequestType getType() {
        return type;
    }

    public String getDescription() {
        return description;
    }
}

public enum RequestType {
    TYPE_A,
    TYPE_B,
    TYPE_C
}

4.客户端代码

public class ChainOfResponsibilityDemo {
    public static void main(String[] args) {
        // 创建处理者链
        Handler handlerA = new ConcreteHandlerA();
        Handler handlerB = new ConcreteHandlerB();
        Handler handlerC = new ConcreteHandlerC();

        handlerA.setNextHandler(handlerB);
        handlerB.setNextHandler(handlerC);

        // 创建请求
        Request requestA = new Request(RequestType.TYPE_A, "Request A");
        Request requestB = new Request(RequestType.TYPE_B, "Request B");
        Request requestC = new Request(RequestType.TYPE_C, "Request C");
        Request requestD = new Request(RequestType.TYPE_A, "Request D");

        // 处理请求
        handlerA.handleRequest(requestA);
        handlerA.handleRequest(requestB);
        handlerA.handleRequest(requestC);
        handlerA.handleRequest(requestD);
    }
}

四、运行效果

运行上述代码后,输出如下:

ConcreteHandlerA handles request: Request A
ConcreteHandlerB handles request: Request B
ConcreteHandlerC handles request: Request C
ConcreteHandlerA handles request: Request D

五、责任链模式的优点

• 降低耦合度:

• 请求的发送者和接收者之间没有直接的耦合关系,增加了系统的灵活性。

• 增强扩展性:

• 可以动态地添加或修改处理者的顺序,而无需修改客户端代码。

• 简化对象结构:

• 避免了复杂的条件语句,使代码更加清晰和易于维护。

六、责任链模式的缺点

• 性能问题:

• 如果链过长,可能会导致请求处理的延迟增加。

• 调试困难:

• 由于请求的处理路径可能不明确,调试时可能需要跟踪整个链。

• 无默认处理:

• 如果链中没有处理者能够处理请求,请求可能会被忽略,需要额外的机制来处理这种情况。

七、责任链模式的应用场景

• 多级审批流程:

• 在多级审批系统中,每个审批级别可以作为一个处理者,请求沿着审批链传递,直到某个级别批准或拒绝。

• 日志处理:

• 在日志系统中,不同级别的日志可以由不同的处理者处理,请求沿着日志链传递,直到某个处理者处理日志。

• 事件处理:

• 在事件驱动的系统中,事件可以沿着处理者链传递,直到某个处理者处理事件。

八、总结

责任链模式是一种非常实用的设计模式,通过将请求的处理者连成一条链,实现了请求的灵活传递和处理。通过合理使用责任链模式,可以降低系统的耦合度,增强系统的扩展性,同时避免使用复杂的条件语句。

// 责任链模式
    static class Solution_20250529213945_6080a9ac877d41a3a0812221e07a4754 {
        static public abstract class Handler {
            protected Handler nextHandler;

            public void setNextHandler(Handler nextHandler) {
                this.nextHandler = nextHandler;
            }

            public abstract void handleRequest(Request request);
        }

        static public class ConcreteHandlerA extends Handler {
            @Override
            public void handleRequest(Request request) {
                if (request.getType() == RequestType.TYPE_A) {
                    System.out.println("ConcreteHandlerA handles request: " + request.getDescription());
                } else if (nextHandler != null) {
                    nextHandler.handleRequest(request);
                }
            }
        }

        static public class ConcreteHandlerB extends Handler {
            @Override
            public void handleRequest(Request request) {
                if (request.getType() == RequestType.TYPE_B) {
                    System.out.println("ConcreteHandlerB handles request: " + request.getDescription());
                } else if (nextHandler != null) {
                    nextHandler.handleRequest(request);
                }
            }
        }

        static public class ConcreteHandlerC extends Handler {
            @Override
            public void handleRequest(Request request) {
                if (request.getType() == RequestType.TYPE_C) {
                    System.out.println("ConcreteHandlerC handles request: " + request.getDescription());
                } else if (nextHandler != null) {
                    nextHandler.handleRequest(request);
                }
            }
        }

        static public class Request {
            private RequestType type;
            private String description;

            public Request(RequestType type, String description) {
                this.type = type;
                this.description = description;
            }

            public RequestType getType() {
                return type;
            }

            public String getDescription() {
                return description;
            }
        }

        static public enum RequestType {
            TYPE_A,
            TYPE_B,
            TYPE_C
        }

        public static void main(String[] args) {
            // 创建处理者链
            Handler handlerA = new ConcreteHandlerA();
            Handler handlerB = new ConcreteHandlerB();
            Handler handlerC = new ConcreteHandlerC();

            handlerA.setNextHandler(handlerB);
            handlerB.setNextHandler(handlerC);

            // 创建请求
            Request requestA = new Request(RequestType.TYPE_A, "Request A");
            Request requestB = new Request(RequestType.TYPE_B, "Request B");
            Request requestC = new Request(RequestType.TYPE_C, "Request C");
            Request requestD = new Request(RequestType.TYPE_A, "Request D");

            // 处理请求
            handlerA.handleRequest(requestA);
            handlerA.handleRequest(requestB);
            handlerA.handleRequest(requestC);
            handlerA.handleRequest(requestD);
        }
    }