TypeScript责任链模式(模拟推送消息处理)
2019-07-20 本文已影响35人
做实事的人
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,都是新时代的语言,也许这些都可以理解为“新”特性吧。