看看用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)和用處。
備忘錄模式 Memento
特點(diǎn):通過(guò)保存對(duì)象之前的狀態(tài)來(lái)使對(duì)象可以恢復(fù)到之前的樣子。
用處:當(dāng)對(duì)象需要保存/加載某一時(shí)刻的狀態(tài)時(shí)可以考慮備忘錄模式,如游戲的save/load。
注意:狀態(tài)過(guò)大產(chǎn)生的開(kāi)銷。
備忘錄應(yīng)該經(jīng)常可以看到,游戲的save/load,photoshop的歷史記錄,windows的還原點(diǎn)都是這個(gè)模式的應(yīng)用。
使用時(shí)也要注意保存的狀態(tài)過(guò)大時(shí)產(chǎn)生的開(kāi)銷,保存在硬盤上的還好,如果是運(yùn)行時(shí)保存在內(nèi)存上的,比如一些復(fù)雜對(duì)象的undo/redo操作,保存每一個(gè)狀態(tài)都是很大的內(nèi)存開(kāi)銷,這時(shí)就需要做些限制,比方設(shè)置一個(gè)歷史記錄棧的最大值來(lái)限定內(nèi)存的使用。
備忘錄的例子和下面的命令模式一起寫,實(shí)現(xiàn)一個(gè)支持undo/redo的操作。
命令模式 Command
特點(diǎn):把請(qǐng)求封裝成命令對(duì)象,命令對(duì)象里包含有接收者,這樣client只需要發(fā)送命令,接收者就可以做出相關(guān)響應(yīng)或相反的響應(yīng)。
用處:當(dāng)需要發(fā)送者和接收者解耦時(shí)可以考慮命令模式,常用于事件響應(yīng),請(qǐng)求排除,undo/redo等。
注意:命令數(shù)量爆炸,需要集中維護(hù)。
下面用TypeScript簡(jiǎn)單實(shí)現(xiàn)一個(gè)命令模式和備忘錄模式的undo/redo:
遙控器算是典型的命令模式,按個(gè)按鈕就可以命令電視做相關(guān)響應(yīng),假設(shè)遙控器有三種功能,開(kāi)、關(guān)和換臺(tái)。
建個(gè)Command、undo/redo、備忘錄以及控制接口:
interface Executable{ execute(param: