Command封装命令模式

别名又叫做Action动作模式或者Transaction事务模式。

这个模式经常被用来实现一个undo的功能。
command经常被用来封装各种各样的命令,因为命令要执行,所以封装类中的不同方法就是命令的具体描述。

例子:文本编辑器
先写一个名为command的类,在这个类中写两个方法,一个doit(),一个undo()。分别代表执行和撤销。

package com.mashibing.dp.command; public abstract class Command { public abstract void doit(); //exec run public abstract void undo(); }

文本编辑器中开始输入具体的文字。

package com.mashibing.dp.command; public class Content { String msg = "hello everybody "; }

然后对输入的内容进行一系列的命令。
对输入内容进行操作的类需要继承 command类,并且覆写类中的方法。

package com.mashibing.dp.command; //添加新的内容 public class InsertCommand extends Command { Content c; String strToInsert = "http://www.mashibing.com"; public InsertCommand(Content c) { this.c = c; } @Override public void doit() { c.msg = c.msg + strToInsert; } @Override public void undo() { c.msg = c.msg.substring(0, c.msg.length()-strToInsert.length()); } }package com.mashibing.dp.command; //删除内容 public class DeleteCommand extends Command { Content c; String deleted; public DeleteCommand(Content c) { this.c = c; } @Override public void doit() { deleted = c.msg.substring(0, 5); c.msg = c.msg.substring(5, c.msg.length()); } @Override public void undo() { c.msg = deleted + c.msg; } }package com.mashibing.dp.command; //复制操作 public class CopyCommand extends Command { Content c; public CopyCommand(Content c) { this.c = c; } @Override public void doit() { c.msg = c.msg + c.msg; } @Override public void undo() { c.msg = c.msg.substring(0, c.msg.length()/2); } }

打开网易新闻 查看精彩图片

前面讲了command模式又叫做Transaction事务模式。在实际应用中,command中的命令需要同时执行或者都不执行。

模式优点

1. 降低对象之间的耦合度。

2. 新的命令可以很容易地加入到系统中。

3. 可以比较容易地设计一个组合命令。

4. 调用同一方法实现不同的功能

模式缺点

使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用。

扩展:
command与记忆模式,可以完成trasaction回滚。
command与责任链模式,可以实现多次undo。
command与组合模式,可以实现宏命令。