看看用TypeScript怎样实现常见的设计模式,顺便复习一下。
学模式最重要的不是记UML,而是知道什么模式可以解决什么样的问题,在做项目时碰到问题可以想到用哪个模式可以解决,UML忘了可以查,思想记住就好。
这里尽量用原创的,实际中能碰到的例子来说明模式的特点和用处。
备忘录模式 Memento
特点:通过保存对象之前的状态来使对象可以恢复到之前的样子。
用处:当对象需要保存/加载某一时刻的状态时可以考虑备忘录模式,如游戏的save/load。
注意:状态过大产生的开销。
备忘录应该经常可以看到,游戏的save/load,photoshop的历史记录,windows的还原点都是这个模式的应用。
使用时也要注意保存的状态过大时产生的开销,保存在硬盘上的还好,如果是运行时保存在内存上的,比如一些复杂对象的undo/redo操作,保存每一个状态都是很大的内存开销,这时就需要做些限制,比方设置一个历史记录栈的最大值来限定内存的使用。
备忘录的例子和下面的命令模式一起写,实现一个支持undo/redo的操作。
命令模式 Command
特点:把请求封装成命令对象,命令对象里包含有接收者,这样client只需要发送命令,接收者就可以做出相关响应或相反的响应。
用处:当需要发送者和接收者解耦时可以考虑命令模式,常用于事件响应,请求排除,undo/redo等。
注意:命令数量爆炸,需要集中维护。
下面用TypeScript简单实现一个命令模式和备忘录模式的undo/redo:
遥控器算是典型的命令模式,按个按钮就可以命令电视做相关响应,假设遥控器有三种功能,开、关和换台。
建个Command、undo/redo、备忘录以及控制接口:
interface Executable{ execute(param: