设计模式-责任链模式

简介

在 JavaScript 中,责任链模式是一种行为设计模式,它使多个对象都有机会处理请求,从而将请求的发送者和接收者解耦。这个模式将接收对象链在一起,并沿着这条链传递请求,直到一个对象处理它为止。

核心概念

  • 处理器(Handler):定义了处理请求的接口。在 JavaScript 中,这可以是一个类或者一个函数。
  • 具体处理器(Concrete Handler):处理器的具体实现。每个处理器决定它可以处理的请求类型,并决定如何处理这些请求。如果一个请求它不能处理,它会将请求传递给链中的下一个处理器。
  • 客户(Client):启动请求的对象。客户不需要知道链中哪一个具体的处理器将处理请求,从而实现发送者和接收者之间的解耦。

使用场景

  • 当多个对象可以处理一个请求,但具体由哪个对象处理则在运行时动态决定时。
  • 当你想在不明确指定接收者的情况下,向多个对象中的一个发出请求时。
  • 当需要动态地指定一组对象处理请求时。

实现责任链模式

在 JavaScript 中,责任链模式可以通过链接多个对象的方法来实现。每个对象都持有下一个对象的引用,形成一条链。

  • 购买请求处理

    假设有一个在线购物的场景,购买请求需要经过多个步骤处理,比如权限验证、库存检查、支付处理。

    javascript 复制代码
    class Handler {
        constructor() {
            this.next = null;
        }
    
        setNext(handler) {
            this.next = handler;
        }
    
        handle(request) {
            if (this.next) {
                this.next.handle(request);
            }
        }
    }
    
    class AuthHandler extends Handler {
        handle(request) {
            if (!request.user.isLoggedIn) {
                console.log("Auth: User is not logged in.");
                return;
            }
            console.log("Auth: User is logged in.");
            super.handle(request);
        }
    }
    
    class InventoryHandler extends Handler {
        handle(request) {
            if (request.item.stock <= 0) {
                console.log("Inventory: Out of stock.");
                return;
            }
            console.log("Inventory: Stock is available.");
            super.handle(request);
        }
    }
    
    class PaymentHandler extends Handler {
        handle(request) {
            if (!request.user.paymentInfo) {
                console.log("Payment: No payment information available.");
                return;
            }
            console.log("Payment: Processed successfully.");
            super.handle(request);
        }
    }
    
    // 使用责任链
    const auth = new AuthHandler();
    const inventory = new InventoryHandler();
    const payment = new PaymentHandler();
    
    auth.setNext(inventory);
    inventory.setNext(payment);
    
    // 创建请求
    const request = {
        user: {
            isLoggedIn: true,
            paymentInfo: true
        },
        item: {
            stock: 1
        }
    };
    
    auth.handle(request);

    在这个例子中,我们定义了三个具体的处理器:AuthHandler、InventoryHandler 和 PaymentHandler。每个处理器在处理请求之后,将请求传递给链中的下一个处理器。如果某个条件不满足(例如,用户没有登录或库存不足),则处理过程停止。

总结

  • 责任链模式通过将请求的发送者和接收者解耦来提高系统的灵活性。
  • 在 JavaScript 中,通过使用类(或者构造函数)和方法链接,可以灵活地实现这一模式。
  • 这种模式特别适用于处理具有多个步骤或多级审批的场景,每个步骤可以独立于其他步骤变化,降低了系统各部分之间的耦合度。
相关推荐
越甲八千9 分钟前
重温设计模式--享元模式
设计模式·享元模式
码农爱java2 小时前
设计模式--抽象工厂模式【创建型模式】
java·设计模式·面试·抽象工厂模式·原理·23种设计模式·java 设计模式
越甲八千2 小时前
重温设计模式--中介者模式
windows·设计模式·中介者模式
犬余2 小时前
设计模式之桥接模式:抽象与实现之间的分离艺术
笔记·学习·设计模式·桥接模式
Theodore_10224 小时前
1 软件工程——概述
java·开发语言·算法·设计模式·java-ee·软件工程·个人开发
越甲八千5 小时前
重拾设计模式--组合模式
设计模式·组合模式
思忖小下8 小时前
梳理你的思路(从OOP到架构设计)_设计模式Composite模式
设计模式·组合模式·eit
机器视觉知识推荐、就业指导8 小时前
C++设计模式:组合模式(公司架构案例)
c++·后端·设计模式·组合模式
越甲八千8 小时前
重拾设计模式--工厂模式(简单、工厂、抽象)
c++·设计模式
重生之绝世牛码10 小时前
Java设计模式 —— 【结构型模式】外观模式详解
java·大数据·开发语言·设计模式·设计原则·外观模式