命令模式小试(三)

2014-11-23 21:59:28 · 作者: · 浏览: 2
teLength+"个字符!");
52 screen.setScreenContent(oldScreenContent);
53 screen.setPos(oldPos);
54 screen.outPut();
55 }
56
57 }
复制代码
可以看到,这个命令对象持有属性包括要删除的长度、删除前屏幕的内容、删除前光标的位置和输出的屏幕。
我们可以看到,每个命令的属性都不尽相同,都包含了其主要的特征。而真正操作这些命令的,是屏幕类。6、下面进行简单的测试:
复制代码
1 public class Test {
2
3 public static void main(String[] args)
4 {
5 //写命令
6 Command write = new WriteCommand("abcd");
7 //移动光标命令
8 Command moveCursor = new MoveCursorCommand(3);
9 //写命令
10 Command write2 = new WriteCommand("123456789");
11 //删除命令
12 Command delete = new DeleteCommand(5);
13
14 //执行这些命令
15 write.execute();
16 moveCursor.execute();
17 write2.execute();
18 delete.execute();
19 //恢复一下
20 write2.recover();
21 }
22 }
复制代码
6、结果如下:
复制代码
-----------------------写命令!内容为:abcd
05:11:06,当前光标位置:4,屏幕刷新输出:abcd
-----------------------移动光标命令,光标移动至3
05:11:06,当前光标位置:3,屏幕刷新输出:abcd
-----------------------写命令!内容为:123456789
05:11:06,当前光标位置:12,屏幕刷新输出:abc123456789d
-----------------------删除命令!删除5个字符!
05:11:06,当前光标位置:8,屏幕刷新输出:dabc1234
-----------------------写命令!撤销内容为:123456789
05:11:06,当前光标位置:3,屏幕刷新输出:abcd
复制代码
可见,每一步命令操作都保存了操作前的屏幕状态,可恢复到任意操作处去。
这种方式有一个缺点,那就是每次操作前都保存了屏幕的所有状态,会消耗大量内存,所以,我们可以用一个队列列表来放这些命令,列表容量是可设置的。超过容量的操作不再保存,即不可恢复。同时这也有一个优点,那就是可以很方便的一键撤销上一步操作。而这个就是命令模式的队列请求。下面我们来试一下。
三、队列请求
1、命令队列如下:
复制代码
1 public class CommandQueue {
2
3 private static LinkedList commands = new LinkedList();
4
5 public synchronized static void addAndExecute(Command cmd){
6 //大于10,就移除第一个
7 if(commands.size() > 10) {
8 commands.remove();
9 }
10 commands.add(cmd);
11 cmd.execute();
12 }
13
14 public synchronized static void recover(Command cmd){
15 if(cmd == null){
16 System.out.println("命令不存在!");
17 }else {
18 cmd.recover();
19 }
20 }
21 }
复制代码
2、测试代码也要改一下:
复制代码
1 public class Test {
2
3 public static void main(String[] args)
4 {
5 //写命令
6 Command write = new WriteCommand("abcd");
7 //移动光标命令
8 Command moveCursor = new MoveCursorCommand(3);
9 //写命令
10 Command write2 = new WriteCommand("123456789");
11 //删除命令
12 Command delete = new DeleteCommand(5);
13
14 //将这些命令依次放入命令列表并执行
15 CommandQueue.addAndExecute(write);
16 CommandQueue.addAndExecute(moveCursor);
17 CommandQueue.addAndExecute(write2);
18 CommandQueue.addAndExecute(delete);
19
20 //恢复一下
21 CommandQueue.recover(write2);
22 }
23 }