命令模式
简单来说这个模式就是任务过多的时候,一个任务分发模式,这种模式讲任务分发和实际操作隔离开来。拿开发小组来进行分析,小组长属于小组内外的对接人,他手上有很多任务,他需要根据每个人和每个任务的搭配程度进行分发任务,而这个时候小组长也会记录下任务分配情况(就是日志)。而在分发任务的过程中,不管是直接找你、还是QQ、OA系统等等,都是一种命令的模式通知你,你需要去完成那些工作,并且同时只是需要完成这些工作,如果还有开会等等,也是同样的操作,而这些操作也是指令。指令模式就是,将你的一个求情封装成一个对象,使得你可以用不同的请求,对客户进行参数化,简而言之就是,你将开会、工作分配等命令设定为一个命令组,然后,每个命令都会知道自己需要找谁,所以当有什么请求的时候,会自动调用对应命令,然后命令会去找到需要找到的对象。

Invoker:使用命令对象的入口。简单来说就是例子中的小组长,上司把任务发给他,他就进行日志记录、任务分发等等
Command:抽象的命令类,常常记录的只是一些命令的公用接口和数据
ConcreteCommand:具体的命令类,对于命令进行具体实现。比如任务分发、开会指令等等,而其中常常是具体的通知对象和具体的任务分配细节等等
Receiver:真正的命令执行者。当把任务分配好和指令下达之后,其完成任务和执行的指令的真正类。
使用环境:
- 当你觉得你的请求都可以视为命令的时候,都可以使用命令模式。如mfc中的消息队列,其实每个按钮操作都有至少一条命令。
- 需要写日志的地方
优点:
- 降低耦合度:将请求发布和实际执行分开
- 容易拓展:具体命令类、实际执行这类几乎可以随便加
- 可以方便的记录日志
- 可以决定某个命令是否执行、并且可以进行添加和消除命令的操作
缺点:
- 指令分的太细,可能是的具体命令类反而太多,只能说过犹不及把。
实操

当自己写完代码,再去分析的时候就简单多了。
思路:
- 有一个分配在Leader,然后去调用命令,那么这个命令ICommand肯定先定义
- 接着派生出CWorkCommand,但是这个时候就需要CStaff,那么就先定义CStaff
- CStaff是去真正完成命令的类,所有肯定有实际执行代码
- 之后完成CWorkCommand的类,简单来说就是重写ICommand方法,然后去使用存储的执行者类调用应该使用的方法
- 完成Leader类,去判断是否需要执行、被那个命令执行、是否需要写日志等等
// CommandModel.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
using namespace std;
#define interface struct
class ICommand
{
public:
virtual void assignWork() = 0;
};
class CStaff
{
public:
void getWork()
{
cout << "被分配了工作了,终于不用划水了。" << endl;
}
};
class CWorkCommand :public ICommand
{
private:
CStaff *m_staff;
public:
CWorkCommand(CStaff* staff) { m_staff = staff; }
void assignWork()
{
if (NULL != m_staff)
{
m_staff->getWork();
}
}
};
class CGroupLeader
{
private:
ICommand* m_command;
public:
CGroupLeader(ICommand* comm) { m_command = comm; }
void assignWork()
{
if (NULL != m_command)
{
m_command->assignWork();
}
}
};
int main()
{
CStaff* staff = new CStaff();
ICommand* command = new CWorkCommand(staff);
CGroupLeader* leader = new CGroupLeader(command);
leader->assignWork();
}
命令模式是一种任务分发模式,将任务与执行隔离开。它包括Invoker(如小组长)、Command(抽象命令类)、ConcreteCommand(具体命令如任务分发、开会指令)和Receiver(执行者)。适用场景包括需要日志记录、降低耦合度和拓展性的场合。优点是降低耦合、易于拓展和记录日志,但可能因具体命令类过多导致复杂性增加。在实际操作中,需要定义如CWorkCommand、CStaff等类来实现命令模式。

2431

被折叠的 条评论
为什么被折叠?



