Typescript 職責鏈模式(Chain of Responsibility)

標籤: 前端 設計模式 職責鏈模式 typescript Chain of Responsibility


請仔細閱讀下面代碼,理解其中的設計理念。

職責鏈模式

職責鏈模式: 職責鏈模式是用來消除消息的請求者和處理者之間的耦合的模式,尤其是在處理者有多個的情況下。

實際場景

逛淘寶我們時常可以看到消費滿多少立減多少,滿的多減的多。
這種根據用戶消費的情況有不同的打折機制就會用到職責鏈模式來解除消息發送者和處理者之間的耦合。

職責鏈模式的結構

  • 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);

職責鏈模式的利弊

利:

  • 有效的解除消息的發送者和處理者之間的耦合,可以更容易的模塊化和重構、修改處理邏輯。

弊:

  • 對象變多了之後,管理起來相對複雜了一點。
  • 在職責鏈中無法保證他一定被處理。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章