命令模式

命令模式是一种任务分发模式,将任务与执行隔离开。它包括Invoker(如小组长)、Command(抽象命令类)、ConcreteCommand(具体命令如任务分发、开会指令)和Receiver(执行者)。适用场景包括需要日志记录、降低耦合度和拓展性的场合。优点是降低耦合、易于拓展和记录日志,但可能因具体命令类过多导致复杂性增加。在实际操作中,需要定义如CWorkCommand、CStaff等类来实现命令模式。

命令模式

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

 

Invoker:使用命令对象的入口。简单来说就是例子中的小组长,上司把任务发给他,他就进行日志记录、任务分发等等

Command:抽象的命令类,常常记录的只是一些命令的公用接口和数据

ConcreteCommand:具体的命令类,对于命令进行具体实现。比如任务分发、开会指令等等,而其中常常是具体的通知对象和具体的任务分配细节等等

Receiver:真正的命令执行者。当把任务分配好和指令下达之后,其完成任务和执行的指令的真正类。

 

使用环境:

  • 当你觉得你的请求都可以视为命令的时候,都可以使用命令模式。如mfc中的消息队列,其实每个按钮操作都有至少一条命令。
  • 需要写日志的地方

优点:

  • 降低耦合度:将请求发布和实际执行分开
  • 容易拓展:具体命令类、实际执行这类几乎可以随便加
  • 可以方便的记录日志
  • 可以决定某个命令是否执行、并且可以进行添加和消除命令的操作

缺点:

  • 指令分的太细,可能是的具体命令类反而太多,只能说过犹不及把。

实操

 

当自己写完代码,再去分析的时候就简单多了。

思路:

  1. 有一个分配在Leader,然后去调用命令,那么这个命令ICommand肯定先定义
  2. 接着派生出CWorkCommand,但是这个时候就需要CStaff,那么就先定义CStaff
  3. CStaff是去真正完成命令的类,所有肯定有实际执行代码
  4. 之后完成CWorkCommand的类,简单来说就是重写ICommand方法,然后去使用存储的执行者类调用应该使用的方法
  5. 完成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();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值