1700463632
1700463633
设计模式之禅 15.4.2 反悔问题
1700463634
1700463635
我们的例子说到这里是不是应该真的结束了?不,还有一个问题会经常发生的:客户发出命令,要撤回,怎么办?就类似你使用Ctl+Z组合键(undo功能),发出一个命令,在没有执行(这时只要重新setCommand就可以了)或执行后撤回(执行后撤回是状态变更)该怎么实现呢?
1700463636
1700463637
有两种方法可以解决,一是结合备忘录模式还原最后状态,该方法适合接收者为状态的变更情况,而不适合事件处理;二是通过增加一个新的命令,实现事件的回滚。例子中的“删除一个页面”就需要一个反命令:撤销刚刚删除页面的命令,那客户发出这样一个命令,我们该怎么处理呢?
1700463638
1700463639
我们这样思考,反命令也是一个命令,那就是Command的一个子类,它实现的功能就是恢复刚刚删除的页面,然后我们再思考,谁能恢复删除的页面呢?当然是页面组了,于是作为接收者的页面组必须还有一个方法恢复最后删除的页面,也就是日志的回滚机制了,指定一个页面,回滚回去。分析完毕,我们来看实现,注意:以下为示意代码,请读者自行在应用中进行实现。修正后的Group如代码清单15-20所示。
1700463640
1700463641
代码清单15-20 修改后的Group类
1700463642
1700463643
public abstract class Group{
1700463644
1700463645
//甲乙双方分开办公,你要和那个组讨论,你首先要找到这个组
1700463646
1700463647
public abstract void find();
1700463648
1700463649
//被要求增加功能
1700463650
1700463651
public abstract void add();
1700463652
1700463653
//被要求删除功能
1700463654
1700463655
public abstract void delete();
1700463656
1700463657
//被要求修改功能
1700463658
1700463659
public abstract void change();
1700463660
1700463661
//被要求给出所有的变更计划
1700463662
1700463663
public abstract void plan();
1700463664
1700463665
//每个接收者都要对直接执行的任务可以回滚
1700463666
1700463667
public void rollBack(){
1700463668
1700463669
//根据日志进行回滚
1700463670
1700463671
}
1700463672
1700463673
}
1700463674
1700463675
仅仅增加了一个rollBack的方法,每个接收者都可以对自己实现的任务进行回滚。怎么回滚?根据事务日志进行回滚!新增加的一个命令CancelDeletePageCommand实现撤销刚刚发出的删除命令,如代码清单15-21所示。
1700463676
1700463677
代码清单15-21 撤销命令
1700463678
1700463679
public class CancelDeletePageCommand extends Command{
1700463680
1700463681
//撤销删除一个页面的命令
[
上一页 ]
[ :1.700463632e+09 ]
[
下一页 ]