设计模式的 C++ 实现---命令模式

前文回顾
单例模式(一)
单例模式(二)
观察者模式
简单工厂模式
工厂方法模式(一)
工厂方法模式(二)
抽象工厂模式(一)
抽象工厂模式(二)
原型模式
外观模式
中介者模式
代理模式
装饰者模式
策略模式
状态模式

前言

所谓命令就是调用某个对象的某个操作,命令模式就是加一个中间对象把一系列要调用的方法先存储起来,以对命令进行控制记录等操作。可以把命令封装成一个对象,也可以直接使用成员函数指针。

实现举例

  1. 场景描述
    定义一个绘画的对象 painter ,有画线、画圆、画矩形等操作。
  2. 命令执行者
#include 
using namespace std;

class Painter
{
     
public:
    Painter(){
     }
    void drawLine()
    {
     
        cout << "画一条线"<<endl;
    }
    void drawRectangle()
    {
     
        cout << "画一个矩形"<<endl;
    }
    void drawCircle()
    {
     
        cout << "画一个圆形"<<endl;
    }
};
  1. 命令存储者
#include 
#include 
#include 
using namespace std;

class Invoker
{
     
public:
    Invoker(){
     }
    typedef function<void()> Command;
    void addCommand(int id,Command & command)
    {
     
        cout <<"添加命令"<<id<<endl;
        callbacklist[id] = command;
    }
    void addCommand(int id,Command && command )
    {
     
        cout <<"添加命令"<<id<<endl;
        callbacklist[id] = std::move(command);
    }
    void removeCommand(int id)
    {
     
        cout <<"撤销命令"<<id<<endl;
        callbacklist.erase(id);
    }
    void Notify()
    {
     
        cout <<"***开始执行命令***"<<endl;
        for( auto iter = callbacklist.begin();iter != callbacklist.end();++iter)
        {
     
            cout<<"执行命令"<<iter->first<<":";
            (iter->second)();
        }
    }
private:
    map<int,Command> callbacklist;

};
  1. 客户端调用

设计模式的 C++ 实现---命令模式_第1张图片

#include "painter.h"
#include "invoker.h"
int main(int argc, char *argv[])
{
     
    QCoreApplication a(argc, argv);

    Painter * painter = new Painter();
    Invoker * invoker = new Invoker();
    invoker->addCommand(1,bind(&Painter::drawLine,painter));
    invoker->addCommand(2,bind(&Painter::drawCircle,painter));
    invoker->addCommand(3,bind(&Painter::drawLine,painter));
    invoker->addCommand(4,bind(&Painter::drawRectangle,painter));
    invoker->removeCommand(3);
    invoker->Notify();

    delete invoker;
    delete  painter;

    return a.exec();
}

你可能感兴趣的:(设计模式,设计模式,c++)