看看用TypeScript怎樣實(shí)現(xiàn)常見(jiàn)的設(shè)計(jì)模式,順便復(fù)習(xí)一下。
學(xué)模式最重要的不是記UML,而是知道什么模式可以解決什么樣的問(wèn)題,在做項(xiàng)目時(shí)碰到問(wèn)題可以想到用哪個(gè)模式可以解決,UML忘了可以查,思想記住就好。
這里盡量用原創(chuàng)的,實(shí)際中能碰到的例子來(lái)說(shuō)明模式的特點(diǎn)和用處。
組合模式 Composite
特點(diǎn):以樹(shù)的形式展示對(duì)象的組合,并且可以以類(lèi)似的方式處理每個(gè)枝點(diǎn)。
用處:當(dāng)對(duì)象組合以樹(shù)狀存在,有父有子,并且對(duì)象的行為差不多時(shí)可以考慮組合模式,如菜單,游戲里的技能樹(shù)。
注意:遍歷組合的性能要求。
下面用TypeScript簡(jiǎn)單實(shí)現(xiàn)一下組合模式:
技能樹(shù)麻煩了點(diǎn),技能激活要引入觀察者模式,就以菜單為例吧。
菜單可以包括子菜單,點(diǎn)擊菜單項(xiàng)時(shí)有子菜單則顯示子菜單,沒(méi)有時(shí)觸發(fā)點(diǎn)擊事件。
先聲明一個(gè)抽象,包含菜單的名字,點(diǎn)擊事件和添加Child,一般情況下Menu會(huì)維護(hù)一個(gè)childs集合,通過(guò)這個(gè)集合來(lái)添加子菜單,不過(guò)這里沒(méi)有用這種方式,采用的是繼承一個(gè)集合來(lái)讓本身?yè)碛屑系哪芰Γ@樣更方便,是父還是子可以通過(guò)字段來(lái)控制,也可以通過(guò)是否有child來(lái)表示。
abstract class MenuBase extends Array<M