• 二十三种设计模式全面解析-解密职责链模式:请求处理的设计艺术



    当我们构建软件系统时,经常会遇到需要处理各种不同类型请求的情况。有时,请求的处理逻辑可能相当复杂,需要按照一定的规则和条件进行处理。在本文中,我们将深入探讨职责链模式在请求处理中的应用。职责链模式通过将请求发送者和接收者解耦,构建一个处理者链条,使请求能够顺序经过不同的处理者进行处理。让我们一起探索这种设计模式的技术要点和适用场景,通过详细的案例代码来理解其实现方式。


    详细案例代码:

    假设我们正在设计一个请求处理系统,系统中有三种请求类型:日志请求、验证请求和授权请求。我们可以使用职责链模式来处理这些请求的逻辑。


    首先,我们定义一个抽象处理者类和具体处理者类:

    // 抽象处理者
    abstract class RequestHandler {
        protected RequestHandler nextHandler;
    
        public void setNextHandler(RequestHandler nextHandler) {
            this.nextHandler = nextHandler;
        }
    
        public abstract void handleRequest(Request request);
    }
    
    // 具体处理者
    class LogRequestHandler extends RequestHandler {
        public void handleRequest(Request request) {
            if (request.getType() == RequestType.LOG) {
                System.out.println("Log request handled: " + request.getMessage());
            } else if (nextHandler != null) {
                nextHandler.handleRequest(request);
            }
        }
    }
    
    class ValidationRequestHandler extends RequestHandler {
        public void handleRequest(Request request) {
            if (request.getType() == RequestType.VALIDATION) {
                System.out.println("Validation request handled: " + request.getMessage());
            } else if (nextHandler != null) {
                nextHandler.handleRequest(request);
            }
        }
    }
    
    class AuthorizationRequestHandler extends RequestHandler {
        public void handleRequest(Request request) {
            if (request.getType() == RequestType.AUTHORIZATION) {
                System.out.println("Authorization request handled: " + request.getMessage());
            } else if (nextHandler != null) {
                nextHandler.handleRequest(request);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    然后,我们定义一个请求类和职责链构建器类:

    // 请求类
    class Request {
        private RequestType type;
        private String message;
    
        public Request(RequestType type, String message) {
            this.type = type;
            this.message = message;
        }
    
        public RequestType getType() {
            return type;
        }
    
        public String getMessage() {
            return message;
        }
    }
    
    // 请求类型枚举
    enum RequestType {
        LOG,
        VALIDATION,
        AUTHORIZATION
    }
    
    // 职责链构建器
    class RequestChainBuilder {
        public RequestHandler build() {
            RequestHandler logHandler = new LogRequestHandler();
            RequestHandler validationHandler = new ValidationRequestHandler();
            RequestHandler authorizationHandler = new AuthorizationRequestHandler();
    
            logHandler.setNextHandler(validationHandler);
            validationHandler.setNextHandler(authorizationHandler);
    
            return logHandler;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    最后,我们在客户端中使用职责链模式处理请求:

    public class Client {
        public static void main(String[] args) {
            RequestChainBuilder builder = new RequestChainBuilder();
            RequestHandler handler = builder.build();
    
            Request logRequest = new Request(RequestType.LOG, "Logging request");
            handler.handleRequest(logRequest);
    
            Request validationRequest = new Request(RequestType.VALIDATION, "Validation request");
            handler.handleRequest(validationRequest);
    
            Request authorizationRequest = new Request(RequestType.AUTHORIZATION, "Authorization request");
            handler.handleRequest(authorizationRequest);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    运行以上代码,输出结果将是:

    Log request handled: Logging request
    Validation request handled: Validation request
    Authorization request handled: Authorization request
    
    • 1
    • 2
    • 3

    总结:

    职责链模式的优雅之处在于它的可扩展性和灵活性。通过添加、移除或重新排序处理者,我们可以轻松地调整请求处理的流程。在真实的应用中,职责链模式经常与其他设计模式结合使用,例如装饰者模式、工厂模式等,以满足更复杂的需求。


    下一篇文章中,我们将进一步揭示更多设计模式的奥秘。敬请期待!


    好了,今天的分享到此结束。如果觉得我的博文帮到了您,您的点赞和关注是对我最大的支持。如遇到什么问题,可评论区留言。


  • 相关阅读:
    【bash工具】jq遍历list
    微信公众号如何变更为订阅号?
    MNN 实现NV12转BGR格式
    [linux] 报错信息重定向
    sql:SQL优化知识点记录(十三)
    Ceph入门到精通-Macvlan网络模式
    代码随想录训练营day58
    Nmap识别目标机器上服务的指纹
    【深度学习】第一章:深度学习概述
    AI时代新爬虫:网站自动转LLM数据,firecrawl深度玩法解读
  • 原文地址:https://blog.csdn.net/lizhong2008/article/details/134503491