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

组合模式 Composite

特点:以树的形式展示对象的组合,并且可以以类似的方式处理每个枝点。

用处:当对象组合以树状存在,有父有子,并且对象的行为差不多时可以考虑组合模式,如菜单,游戏里的技能树。

注意:遍历组合的性能要求。

下面用TypeScript简单实现一下组合模式:
技能树麻烦了点,技能激活要引入观察者模式,就以菜单为例吧。
菜单可以包括子菜单,点击菜单项时有子菜单则显示子菜单,没有时触发点击事件。

先声明一个抽象,包含菜单的名字,点击事件和添加Child,一般情况下Menu会维护一个childs集合,通过这个集合来添加子菜单,不过这里没有用这种方式,采用的是继承一个集合来让本身拥有集合的能力,这样更方便,是父还是子可以通过字段来控制,也可以通过是否有child来表示。

abstract class MenuBase extends Array<M