一、command模式要点
command模式是将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化。
核心目的:有时候必须向某对象提交请求,但并不想知道关于被请求者的信息(将请求本身与被请求者解耦)
模式的适用性:
当有如下需求时,可使用command模式:
1.由于command模式是回调机制的一个面向对象的代替品,故需要使用回调机制的场景都可以使用
2.支持在不同时刻,动态指定、排列、取消和执行请求
模式结构
模式参与者:
Command类:抽象类,提供一个接口标准
ConcreteCommand类:具体类,即基于Command类提供的接口标准进行实现的具体类
Invoker类:命令的集合(可选)
clinet:创建一个具体命令对象,并设定它的接收站
Receiver类:命令的接收者,即实际动作的完成者
二、模式举例
1.实例说明
Command类:抽象类,提供一个接口标准
PasteCommand类:ConcreteCommand类
Document类:Receiver类
2.C++代码实现
C++代码运行结果
总结
该模式的优点:
类间解耦:调用者角色与接收者角色之间没有任何依赖关系,调用者实现功能时只需调用Command 抽象类的execute方法就可以,不需要了解到底是哪个接收者执行。
可扩展性:Command的子类可以非常容易地扩展,而调用者Invoker和高层次的模块Client不产生严 重的代码耦合
命令模式结合其他模式会更优秀:命令模式可以结合责任链模式,实现命令族解析任务;结合模板方法模式,则可以减少 Command子类的膨胀问题。
该模式的缺点:
命令模式也是有缺点的,请看Command的子类:如果有N个命令,问题就出来 了,Command的子类就可不是几个,而是N个,这个类膨胀得非常大,这个就需要读者在项 目中慎重考虑使用。