t******h 发帖数: 120 | 1 刚面的一个local 小公司
前面都是问简单的编程题 问烂的那种
最后问一个design pattern的题
怎么实现Undo
我说Command Pattern
一个Command接口 所有操作都实现这个接口
然后每个执行一个操作就放Command list里
Undo找到最后list的最后一个 然后反转操作
接着问 如果想undo 之后redo呢
弄个iterator iterate back Command list 就可以undo
然后 iterate next command in command list就可以redo
最后一问 感觉没答好
如果undo的操作是不能完美undo的呢 比如mp3 把声音转成mp3之后 undo的话就不能完
美变回原来了 咋办
我说cache原来的状态一段时间
不知道有没有更好的方法? |
r***8 发帖数: 86 | 2 UNDO 必须要可逆操作才行
使用STACK,不但需要压命令,但还需要存放UNDO操作数据
UNDO,时,POP的出命令,数据可以压入另一个RE-DO STACK。
新命令执行时,应清掉RE-DO STACK
【在 t******h 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 刚面的一个local 小公司 : 前面都是问简单的编程题 问烂的那种 : 最后问一个design pattern的题 : 怎么实现Undo : 我说Command Pattern : 一个Command接口 所有操作都实现这个接口 : 然后每个执行一个操作就放Command list里 : Undo找到最后list的最后一个 然后反转操作 : 接着问 如果想undo 之后redo呢 : 弄个iterator iterate back Command list 就可以undo
|
K******g 发帖数: 1870 | 3 要用到两种设计模式:memento 和 command。设计要点:
1。定义一个orginator,也就是command里的receiver的类,操作对象
2. 定义一个memento的类,用来保存操作对象的状态。orginator是它的freind,这样
子操作对象就可以读取memento的内部保存的状态。
3. 定义一个command class,里面有个command list, 和memento list
4. 还有一个receiver, receiver的action (receiver也就是origninator)
5. 每次执行一个command的时候,放到command list,同时设个checkpoint把
originator的状态保存到一个memento的object里,放在memento list
6. undo的时候,读取memento list里前一个memento,回复orginator的状态
4. redo的时候,在memento list里往后移,恢复originator的状态
【在 t******h 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 刚面的一个local 小公司 : 前面都是问简单的编程题 问烂的那种 : 最后问一个design pattern的题 : 怎么实现Undo : 我说Command Pattern : 一个Command接口 所有操作都实现这个接口 : 然后每个执行一个操作就放Command list里 : Undo找到最后list的最后一个 然后反转操作 : 接着问 如果想undo 之后redo呢 : 弄个iterator iterate back Command list 就可以undo
|