命令模式:
给功能类集设置一个接口人(执行者)执行所有需求命令,避免外部(调用者)直接调用某个功能类的内部函数产生大量耦合,用于类间解耦。
命令模式是一个高内聚的模式,将一个请求封装为一个对象,使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可提供命令的撤销和恢复功能。
优点:
类间解耦:调用者与执行者之间无依赖关系,调用者实现功能时只需调用Command抽象类的excute方法就可以,无需了解是哪个接受者执行,这也使得上层的调用模块更加的简单易懂,提高代码的复用性和易维护性。
可扩展:Command的子类可以非常容易的扩展,而调用者Invoker和高层次的模块Client不产生严重的代码耦合。
命令模式结合其他模式会更加优秀:
命令模式可结合责任链模式,实现命令族解析任务。
结合模板方法模式,可减少Command子类的膨胀问题。
缺点:
如果命令较多,就需要扩展多个Command子类,使它膨胀的非常大。
使用场景:
只要程序员认为是命令的地方就可以采用命令模式,如GUI开发中,点击一个按钮是一个命令,可以采用命令模式等。
以下是参照设计模式之禅中使用c++实现的“通过接口人执行客户端命令,调用功能类完成命令”的示例代码,目的是将具体功能类与高层类的耦合通过命令模式消除掉,提高内聚性。
第一步:确定功能类
class Group//功能小组基类
{
public:
virtual void find() = 0;
virtual void add() = 0;
virtual void change() = 0;
virtual void plan() = 0;
protected:
string GroupName;
};
class CodeGroup :public Group//功能小组子类,或细节类
{
public:
CodeGroup()
{
GroupName = "CodeGroup";
}
virtual void find()
{
cout << GroupName << "do find method" << endl;
}
virtual void add()
{
cout << GroupName << "do add method" << endl;
}
virtual void change()