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

    职责链模式的利弊

    利:

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

    弊:

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


    作者:我不叫奇奇
    链接:https://www.jianshu.com/p/d35b618754ba
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    Windows 解压缩XX.zip.001 XX.z01分卷文件的方法
    Android Library 发布开源库 JCenter & JitPack 攻略
    常见场景下Fragment和Activity的生命周期对比
    Android Studio 插件 ADBWifi 无线调试真机
    Flutter upgrade更新版本引发的无法启动调试APP的错误 target:kernel_snapshot failed”
    Glide异常:Failed to find GeneratedAppGlideModule 解决实践
    Android 讯飞语音听写SDK快速接入(附空指针解决和修改对话框文字方法)
    Android 自定义View—清爽小巧灵活的多节点进度条
    Android EXCEL 解析 xls 和 xlsx,方法其实很简单
    解决repo从codeaurora.org同步Android代码失败问题
  • 原文地址:https://www.cnblogs.com/wodehao0808/p/14103839.html
Copyright © 2020-2023  润新知