命令模式
定义:讲一个请求封装成一个对象,使发出请求的责任和执行请求的责任分隔开。两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。
通用类图:
从类图中可以看到有三个角色:
- Command命令角色:需要执行的所有命令都在这里声明。
- Receiver接收者角色:执行命令功能的相关操作,是具体命令对象业务的真正实现者。
- Invoker调用者角色:是请求的发送者,它通常拥有很多的命令对象,并通过访问命令对象来执行相关请求,它不直接访问接收者。
命令模式的实现:
定义抽象接收者和其实现
1 | public abstract class Receiver { |
接收者可以有多个,根据具体的业务来定义
定义命令角色:
1 | public abstract class Command { |
命令类的实现也可以有多个。
调用者Invoker:
1 | public class Invoker { |
1 | public class Main { |
命令模式优点:
- 类间解耦:调用者角色和接收者角色之间没有依赖,调用者实现功能时值需要调用Command抽象类的execute方法就可以,不需要了解是哪个接收者执行。
- 可扩展性:Command的子类可以很容易扩展,调用者和高层次的模块的Client不产生严重的耦合。
- 命令模式结合其他模式使用效果更好。可以结合责任链模式,实现命令族解析任务;结合模板方法模式,可以减少Command子类的膨胀问题。
缺点:
可能产生大量具体命令类。因为计对每一个具体操作都需要设计一个具体命令类,这将增加系统的复杂性
使用场景:
- 当系统需要将请求调用者与请求接收者解耦时,命令模式使得调用者和接收者不直接交互。
- 当系统需要随机请求命令或经常增加或删除命令时,命令模式比较方便实现这些功能。
- 当系统需要执行一组操作时,命令模式可以定义宏命令来实现该功能。
- 当系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作时,可以将命令对象存储起来,采用备忘录模式来实现。
代码GitHub
欢迎关注公众号: