看看用TypeScript怎样实现常见的设计模式,顺便复习一下。
学模式最重要的不是记UML,而是知道什么模式可以解决什么样的问题,在做项目时碰到问题可以想到用哪个模式可以解决,UML忘了可以查,思想记住就好。
这里尽量用原创的,实际中能碰到的例子来说明模式的特点和用处。

职责链模式 Chain of Responsibility

特点:可以让一个请求被不同的对象处理多次,请求像经过管道一样, 一路上都可以被拦下处理。

用处:当请求需要被链式处理时,可以考虑职责链模式,比如事件的冒泡,WebApi的管道Handler等。

注意:链的实现。

WebApi的handler可能大家有用过,对发出去的请求和请求回来的数据都可以用自定义handler在发出前或最终回来前进行处理,非常方便,下面用TypeScript来简单实现一个HttpHandler:

先建立一个抽象Handler类,包含一个发送请求的sendReqeust以及用来链式处理的innerHandler:

abstract class HttpHandler{constructor(protected innerHandler: HttpHandler){}async sendRequest(req: string): Promise<string>{if(this.innerHandler){return await this.innerHandler.sendRequest(req);} else {let res = `response`;console.log(res);return res;}   }
}

实现第一个Handler类:

class FirstHttpHandler extends HttpHandler{async sendRequest(req: string): Promise<string>{req = `<req1>${req}</req1>`; // 把请求包一下console.log(req);let res = await super.sendRequest(req);res = `<res1>${res}</res1>`; // 把结果包一下console.log(res);return res;}
}

再实现第二个Handler类:

class SecondHttpHandler extends HttpHandler{async sendRequest(req: string): Promise<string>{req = `<req2>${req}</req2>`; // 把请求包一下console.log(req);let res = await super.sendRequest(req);res = `<res2>${res}</res2>`; // 把结果包一下console.log(res);return res;}
}

把两个HttpHandler连起来

let httpHandler = new FirstHttpHandler(new SecondHttpHandler(undefined));
console.log('start')
httpHandler.sendRequest('request').then(res=>console.log('finish'));

输出:

start<req1>request</req1> // 发请求前先在FirstHttpHandler里处理request<req2><req1>request</req1></req2> // 在SecondHttpHandler里再次处理requestresponse // 返回数据<res2>response</res2> // SecondHttpHandler对返回数据的第一次处理<res1><res2>response</res2></res1> // FirstHttpHandler对返回数据的第二次处理finish

处理的顺序就是 1221,中间是真正取数据的,这就是管道处理最基本的代码,用到的就是职责链模式。

当然职责链的形成有很多方式,这里采用的是装饰手段,保存下一个的引用的方式来形成一个链表,还可以采用队列或栈方式保存所有handler,按顺序执行。

状态模式 State

特点:通过状态来改变对象的行为。

用处:当对象的行为取决于它的状态或者有很多if else之类的是由状态控制的时候可以考虑状态模式,如常见的状态机。

注意:状态是由谁来转换。

下面用TypeScript简单实现一下状态模式:
大家都玩过游戏,控制游戏的主角时鼠标左键可以是移动,遇到怪时点击左键是攻击,遇到NPC时是对话。
下面就以这点简单实现个状态模式:

角色和状态的接口,状态只需要处理当前状态需要做的事:

interface Role{name: string;click();changeState(state: State);
}interface State{handle(role: Role);
}

角色的具体实现:

class Player implements Role{private state: State;constructor(public name: string){}click(){if(this.state){this.state.handle(this);}}changeState(state: State){this.state = state;console.log(`change to ${this.state.constructor.name}`);}
}

状态的具体实现,分为移动状态,攻击状态,对话状态:

class MoveState implements State{static readonly instance = new MoveState();handle(role: Role){console.log(`${role.name} is moving`);}
}class AttackState implements State{static readonly instance = new AttackState();handle(role: Role){console.log(`${role.name} is attacking`);}
}class TalkState implements State{static readonly instance = new TalkState();handle(role: Role){console.log(`${role.name} is talking`);}
}

使用:

let player = new Player('brook');player.changeState(MoveState.instance);
player.click();player.changeState(AttackState.instance);
player.click();player.changeState(TalkState.instance);
player.click();//输出:
change to MoveState
brook is movingchange to AttackState
brook is attackingchange to TalkState
brook is talking

这样随着状态的变化,点击左键做不同的事。
对于由谁来驱动状态变化可以根据实际情况来考虑,简单的话直接放角色里面就行,由角色自己决定自己的状态,复杂的话可以考虑用表来驱动状态机,通过表过实现状态的跳转。

转载于:https://www.cnblogs.com/brookshi/p/6541312.html

TypeScript设计模式之职责链、状态相关推荐

  1. 【设计模式】—— 职责链模式ChainOfResponsibility

    模式意图 避免请求的发送者,和接受者过度的耦合在一起.一个请求者只需要发送一个请求即可,它的请求具体由后面哪个对象进行响应,并不需要关心.而请求的接受者可以自己处理它,也可以把它像链条一样向后传. 因 ...

  2. python设计模式案例分析_Python设计模式之职责链模式原理与用法实例分析

    本文实例讲述了Python设计模式之职责链模式原理与用法.分享给大家供大家参考,具体如下: 职责链模式(Chain Of Responsibility):使多个对象都有机会处理请求,从而避免发送者和接 ...

  3. 设计模式之职责链模式应用例题

    设计模式之职责链模式应用例题 题目描述 类结构图及相关说明 程序代码 运行结果 题目描述 在军队中,一般根据战争规模的大小和重要性由不同级别的长官(Officer)来下达作战命令,情报人员向上级递交军 ...

  4. 【设计模式】职责链模式(C#)

    [设计模式]职责链模式 1.概述 在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同.例如,公司员工请假或者加薪,可处理的领导有HR.部门负责人.副总经理. ...

  5. 设计模式之职责链模式(Chain of Responsibility)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  6. 『设计模式』职责链模式(Chain of Responsibility) 可怜的加薪、请假之路

    23种设计模式+额外常用设计模式汇总 (持续更新) 问题抽象 客户端发出一个请求,会有很多对象都可以来处理这个请求,而且不同对象的处理逻辑是不一样的. 对于客户端而言,无所谓谁来处理,反正有对象处理就 ...

  7. 设计模式之职责链模式、减小了因为分支带来的耦合

    1. 定义 职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一 ...

  8. 设计模式复习-职责链模式

    #pragma once #include "stdafx.h" #include<set> #include<string> #include<io ...

  9. JBPM与设计模式之职责链模式

    上篇我们了解并学习了JBPM的长事务实现,其中用到了设计模式中的职责链模式和命令模式:这块还是很有厚重感的,我们可以从中学到很多的东西:今天我们先来学习一下职责链模式. 职责链模式定义 使多个对象都有 ...

  10. C++设计模式14——职责链模式

    https://blog.csdn.net/CoderAldrich/article/details/83183388 什么是职责链模式? 在GOF的<设计模式:可复用面向对象软件的基础> ...

最新文章

  1. 这是我看过最好的Java编程入门视频教程!
  2. 什么是SAP Commerce Cloud OCC
  3. ECharts 学习笔记
  4. pap与chap协议
  5. modelmap前端怎么取值_【百度】前端开发岗面试题
  6. js 对象的_proto_属性 和函数的prototype属性分析
  7. 剑指offer 数字在排序数组中出现的次数
  8. HTML一片空白, 无法渲染: Empty tag doesn't work in some browsers
  9. 计算机设计大赛学生现场,我校学生在2019计算机设计大赛全国总决赛中再创佳绩...
  10. winform仿QQ聊天气泡(c#代码+GDI绘图)
  11. html数据如何分页显示,简单的html数据分页控件封装
  12. powerdesign新手入门详细教程
  13. 知乎视频:联合创作盘活内容价值
  14. POJ1753(枚举)
  15. 焦虑 程序员_我如何克服焦虑和沮丧来完成freeCodeCamp的前端开发程序
  16. 放大器为什么会被限幅?原因所在!
  17. 教资考试中计算机知识常考点,教师资格证笔试:初中美术必背考点汇总(3)...
  18. virtual的用法
  19. cordova wifi插件(cordova plugin add cordova-plugin-hotspot)
  20. 三极管打造树莓派温控风扇

热门文章

  1. 我的前端面试日记(一)
  2. 云服务器真假辨别奥秘
  3. CakePHP 2.x CookBook 中文版 第三章 入门(三)
  4. Spring Quartz 框架结构概述(一)[转]
  5. 巧妙检查WinXP系统漏洞
  6. 一个功能强大超级好用的图表组件Dundas Chart
  7. 谷歌推出3D社区“Lively” 挑战第二人生(组图)
  8. Linux学习笔记七:下载文件到开发板--搭建TFTP服务器
  9. XSRF(XSS+CSRF)
  10. ASP.NET MVC 使用dataTable(3)--更多选项参考