Typescript责任链模式(模拟推送消息处理)

chain-of-responsibility.png

环境:WebStorm
语言:TypeScript

责任链优缺点:

优点:

  • 可以控制处理流程,处理器的位置可以根据需要进行快速更改
  • 单一职责,每个处理器只会处理与自己想干的内容
  • 开闭原则,在不破坏原有代码结构的情况下,添加上新的处理器处理新流程

缺点:

  • 处理流程是一对一的关系,一个消息只能给一个处理器处理,那么就意味着,有可能一些消息根本无法到达一些处理器的处理逻辑中。
interface Handler {
    setNext(handler:Handler):Handler;
    handle(request:string):string;

}

abstract class AbstractHandler implements Handler{

    //下一个处理对象
    private nextHandler:Handler;

    handle(request: string): string {
        //是否存在下一个对象?是就处理
        if (this.nextHandler) {
            return this.nextHandler.handle(request);
        }
        return null;
    }

    setNext(handler: Handler): Handler {
        this.nextHandler = handler;
        return handler;
    }

}


class _900PushHandler extends AbstractHandler{

    handle(request: string): string {
        if (request === '900') {
            return `900详情推送处理器:这个推送我处理了,推送号段:${request}`
        }
        return super.handle(request);
    }
}

class _3000PushHandler extends AbstractHandler{

    handle(request: string): string {
        if (request === '3000') {
            return `3000第三方任务推送处理器:这个推送我处理了,推送号段:${request}`
        }
        return super.handle(request);
    }
}

class _3001PushHandler extends AbstractHandler{

    handle(request: string): string {
        if (request === '3001') {
            return `3001抢单任务推送处理器:这个推送我处理了,推送号段:${request}`
        }
        return super.handle(request);
    }
}

/**
 * 模拟推送服务发送消息
 */
function receiverHandler(handler:Handler) {
    const pushCodes = ['3000','900','700'];
    for (const pushCode of pushCodes) {
        console.log(`发送一个推送消息,号段是: ${pushCode}`);
        const result  = handler.handle(pushCode);

        if (result) {
            console.log(` 推送消息给处理了 ${result}`);

        }else {
            console.log(` 这个推送号段没有人处理: ${pushCode}`);

        }
    }
}

const _m900PushHandler = new _900PushHandler();
const _m3000PushHandler = new _3000PushHandler();
const _m3001PushHandler = new _3001PushHandler();

//责任链模式:链接处理器
_m900PushHandler.setNext(_m3000PushHandler).setNext(_m3001PushHandler);

//推送服务器,选择一个链的节点,进行推送消息
receiverHandler(_m900PushHandler);

输出结果

C:\Users\Aniu\Desktop\github_advanced>node ChainofResponsibility.js
发送一个推送消息,号段是: 3000
 推送消息给处理了 3000第三方任务推送处理器:这个推送我处理了,推送号段:3000
发送一个推送消息,号段是: 900
 推送消息给处理了 900详情推送处理器:这个推送我处理了,推送号段:900
发送一个推送消息,号段是: 700
 这个推送号段没有人处理: 700

TypeScript让JS代码写的跟Kotlin似的,相似真的高。我认真对比了一下官网上的demo,一个带泛型的方法,区别竟然就是一个关键字fun与function,Kotlin中是fun,TypeScript 则延续了JS中的方法关键字function,都是新时代的语言,也许这些都可以理解为“新”特性吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,432评论 0 3
  • 一、什么是 TypeScript? 百度解释:TypeScript是一种由微软开发的自由和开源的编程语言。它是Ja...
    wave浪儿阅读 2,262评论 1 20
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 2,154评论 1 10
  • HTML HTML5标签 媒体查询head部分写法 Doctype作用? 严格模式与混杂模式如何区分?它们有何意义...
    Mayo_阅读 681评论 0 8
  • 针对7种欲望写文案 傲慢,妒忌,暴怒,贪食,贪婪,色欲,懒惰 扫地机器人 你会忘记扫地,但请别忘了它。--- 懒惰...
    细颖阅读 259评论 0 0