zoukankan      html  css  js  c++  java
  • 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
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    防火墙透明模式
    HP管理工具System Management Homepage安装配置
    kbmmw 中JSON 中使用SQL 查询
    kbmmw 中JSON 操作入门
    第一个kbmmw for Linux 服务器
    kbmmw 5.02发布
    kbmmw 5.01 发布
    使用delphi 10.2 开发linux 上的Daemon
    使用unidac 在linux 上无驱动直接访问MS SQL SERVER
    使用delphi 10.2 开发linux 上的webservice
  • 原文地址:https://www.cnblogs.com/wodehao0808/p/14103839.html
Copyright © 2011-2022 走看看