模式定义
命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。模式的核心思想将一个请求封装成一个对象,从而可以用不同的请求对客户进行参数化。
实现
定义三个角色:
- RealCommandExecutor, 真正的命令执行对象;
- Command,封装了具体命令执行者的命令对象
- Invoke,使用命令对象的入口
模式示例
举一个例子,一个控制终端,可以控制5种不同的角色进行攻击,这5种角色就是上面的真正命令执行对象,5中角色分别对应5个Command,调用者可以通过控制终端让执行不同的命令以让不同角色进行攻击。下面看具体代码。
1 | public interface Command { |
定义5中不同的具体命令执行对象。
1 | /** |
1 | /** |
1 | /** |
1 | /** |
1 | /** |
将不同角色的攻击请求封装成Command命令
1 | /** |
1 | /** |
1 | /** |
1 | /** |
1 | /** |
定义一个远程控制终端
1 | /** |
编写客户端运行
1 | public class FightMain { |
输出结果
1 | ------------Remote Control------------ |
从上例可以看出,我们可以很容易的新增一种角色,然后定义该角色的攻击方式,可以使单次攻击(attack里面调用一个攻击方法),也可以是组合攻击(attack里面调用两个攻击方法),还可以利用组合模式,将一组命令封装成Command对象来执行。当然前提是要有相应的角色,要有相应的命令,也就是说要有相应的类。这就可能造成命令泛滥的情形,需要加以控制。
模式总结
优缺点
- 优点
- 降低了系统耦合度;
- 新的命令可以很容易添加到系统中去。
- 缺点
- 使用命令模式可能会导致某些系统有过多的具体命令类;
使用场景
认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。
注意事项
系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式。关于命令模式的扩展,可以参考这篇文章。