Typescript 职责链模式(Chain of Responsibility)

标签: 前端 设计模式 职责链模式 typescript Chain of Responsibility


请仔细阅读下面代码,理解其中的设计理念。

chain-of-responsibility.jpg

职责链模式

职责链模式: 职责链模式是用来消除消息的请求者和处理者之间的耦合的模式,尤其是在处理者有多个的情况下。

实际场景

逛淘宝我们时常可以看到消费满多少立减多少,满的多减的多。
这种根据用户消费的情况有不同的打折机制就会用到职责链模式来解除消息发送者和处理者之间的耦合。

职责链模式的结构

  • Sender: 消息的发送者
  • Handler的抽象类: 处理者的抽象类或接口
  • Handler: 各种处理者们

职责链模式的例子

现在有商场打折如下

普通折扣: 消费不满100元,不打折
黄金折扣: 消费满100元,打9折
铂金折扣: 消费满500元,打8折
钻石折扣: 消费满1000元,打7折

我们用职责链模式
先定义抽象类

/* handler-abstract-class.ts */
export abstract class HandlerAbstractClass {
    protected name: string;

    protected higherLevel: HandlerAbstractClass;

    constructor (name: string) {
        this.name = name;
    }

    public setHigherLevel (higherLever: HandlerAbstractClass) {
        this.higherLevel = higherLever;
    }

    public abstract handlerMessage (money: number)
}

定义几个等级

/* level-1.ts */
import { HandlerAbstractClass } from './handler-abstract-class';

export class Level1 extends HandlerAbstractClass {
    public handlerMessage(money: number) {
        if (money < 100) {
            console.log(`您消费${money}元,当前折扣为${this.name}折扣,还需支付${money}元`);
        } else {
            this.higherLevel.handlerMessage(money);
        }
    }
}
/* level-2.ts */
import { HandlerAbstractClass } from './handler-abstract-class';

export class Level2 extends HandlerAbstractClass {
    public handlerMessage(money: number) {
        if (money < 500) {
            console.log(`您消费${money}元,当前折扣为${this.name}折扣,还需支付${money * 0.8}元`);
        } else {
            this.higherLevel.handlerMessage(money);
        }
    }
}
/* level-3.ts */
import { HandlerAbstractClass } from './handler-abstract-class';

export class Level3 extends HandlerAbstractClass {
    public handlerMessage (money: number) {
        if (money < 1000) {
            console.log(`您消费${money}元,当前折扣为${this.name}折扣,还需支付${money * 0.7}元`);
        } else {
            this.higherLevel.handlerMessage(money);
        }
    }
}
/* level-4.ts */
import { HandlerAbstractClass } from './handler-abstract-class';

export class Level4 extends HandlerAbstractClass {
    public handlerMessage(money: number) {
        console.log(`您消费${money}元,当前折扣为${this.name}折扣,还需支付${money * 0.6}元`);
    }
}

客户端调用

/* client.ts */
import { Level1 } from './level-1';
import { Level2 } from './level-2';
import { Level3 } from './level-3';
import { Level4 } from './level-4';

export class Client {
    public static getDiscount(money: number) {
        const level4 = new Level4('钻石');
        const level3 = new Level3('铂金');
        const level2 = new Level2('黄金');
        const level1 = new Level1('普通');
        level2.setHigherLevel(level3);
        level1.setHigherLevel(level2);
        level1.handlerMessage(money);
    }
}
Client.getDiscount(1176);

职责链模式的利弊

利:

  • 有效的解除消息的发送者和处理者之间的耦合,可以更容易的模块化和重构、修改处理逻辑。

弊:

  • 对象变多了之后,管理起来相对复杂了一点。
  • 在职责链中无法保证他一定被处理。

推荐阅读更多精彩内容