Typescript 职责链模式(Chain of Respon

2019-01-21  本文已影响5人  我不叫奇奇

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


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

chain-of-responsibility.jpg

职责链模式

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

实际场景

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

职责链模式的结构

职责链模式的例子

现在有商场打折如下

普通折扣: 消费不满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);

职责链模式的利弊

利:

弊:

上一篇下一篇

猜你喜欢

热点阅读