写一个计算器类(Calculator),可以实现两个数的加、减、乘、除运算,并可以进行undo和redo操作,这里设计为redo需要和undo搭配使用,即前面没有执行undo,直接redo不生效,所以计算过程中redo次数要小于等于undo次数。
这个需求的难点是要对计算过程进行记录,以实现操作的撤销和重做,这里提供两种方案
- 将所有操作写入一个Calculator类中,包含cal,undo,redo等方法,使用ArrayList记录历史输入和结果,用算法思路实现。
- 选择命令模式的设计思路,将请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令,将行为的请求与执行解耦,整个流程需要定义四个角色:
-
Command: 是一个接口,定义执行,撤销命令
-
ConcreteCommand: 具体的执行命令,他们需要实现Command接口, 这里是CalculatorCommand类
-
Receiver: 真正执行命令的角色,这里是Calculator类
-
Invoker: 负责按照客户端的指令设置并执行命令,这里是实际调用计算器方法的部分。