设计模式-责任链模式

简介

在 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 中,通过使用类(或者构造函数)和方法链接,可以灵活地实现这一模式。
  • 这种模式特别适用于处理具有多个步骤或多级审批的场景,每个步骤可以独立于其他步骤变化,降低了系统各部分之间的耦合度。
相关推荐
李广坤1 小时前
状态模式(State Pattern)
设计模式
李广坤2 小时前
观察者模式(Observer Pattern)
设计模式
李广坤3 小时前
中介者模式(Mediator Pattern)
设计模式
李广坤3 小时前
迭代器模式(Iterator Pattern)
设计模式
李广坤4 小时前
解释器模式(Interpreter Pattern)
设计模式
阿无,7 小时前
java23种设计模式之前言
设计模式
Asort7 小时前
JavaScript设计模式(八):组合模式(Composite)——构建灵活可扩展的树形对象结构
前端·javascript·设计模式
数据智能老司机8 小时前
数据工程设计模式——数据基础
大数据·设计模式·架构
笨手笨脚の10 小时前
设计模式-代理模式
设计模式·代理模式·aop·动态代理·结构型设计模式
Overboom18 小时前
[C++] --- 常用设计模式
开发语言·c++·设计模式