環(huán)境:WebStorm
語言:TypeScript
責任鏈優(yōu)缺點:
優(yōu)點:
- 可以控制處理流程阎抒,處理器的位置可以根據(jù)需要進行快速更改
- 單一職責蜘醋,每個處理器只會處理與自己想干的內容
- 開閉原則,在不破壞原有代碼結構的情況下症虑,添加上新的處理器處理新流程
缺點:
- 處理流程是一對一的關系连霉,一個消息只能給一個處理器處理,那么就意味著佛呻,有可能一些消息根本無法到達一些處理器的處理邏輯中裳朋。
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);
}
}
/**
* 模擬推送服務發(fā)送消息
*/
function receiverHandler(handler:Handler) {
const pushCodes = ['3000','900','700'];
for (const pushCode of pushCodes) {
console.log(`發(fā)送一個推送消息绑莺,號段是: ${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);
//推送服務器暖眼,選擇一個鏈的節(jié)點,進行推送消息
receiverHandler(_m900PushHandler);
輸出結果
C:\Users\Aniu\Desktop\github_advanced>node ChainofResponsibility.js
發(fā)送一個推送消息纺裁,號段是: 3000
推送消息給處理了 3000第三方任務推送處理器:這個推送我處理了诫肠,推送號段:3000
發(fā)送一個推送消息司澎,號段是: 900
推送消息給處理了 900詳情推送處理器:這個推送我處理了,推送號段:900
發(fā)送一個推送消息栋豫,號段是: 700
這個推送號段沒有人處理: 700
TypeScript讓JS代碼寫的跟Kotlin似的挤安,相似真的高。我認真對比了一下官網上的demo丧鸯,一個帶泛型的方法蛤铜,區(qū)別竟然就是一個關鍵字fun與function,Kotlin中是fun骡送,TypeScript 則延續(xù)了JS中的方法關鍵字function昂羡,都是新時代的語言,也許這些都可以理解為“新”特性吧摔踱。