命令行模式
2020 年 09 月 08 日 228 480 字 暂无评论

01.概念

  • Command模式也叫命令模式 ,是行为设计模式的一种。Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数。
  • 在面向对象的程序设计中,一个对象调用另一个对象,一般情况下的调用过程是:创建目标对象实例;设置调用参数;调用目标对象的方法。
  • 但在有些情况下有必要使用一个专门的类对这种调用过程加以封装,我们把这种专门的类称作Command类。
  • 整个调用过程比较繁杂,或者存在多处这种调用。这时,使用Command类对该调用加以封装,便于功能的再利用。-
  • 调用前后需要对调用参数进行某些处理。调用前后需要进行某些额外处理,比如日志,缓存,记录历史操作等。

02.角色和职责

  • Command

    • Command命令的抽象类。
  • ConcreteCommand

    • Command的具体实现类。
  • Receiver

    • 需要被调用的目标对象。
  • Invorker

    • 通过Invorker执行Command对象。
  • 适用于:

    • 是将一个请求封装为一个对象,从而使你可用不同的请求对客户端进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

03.代码案例

#include <iostream>
#include <list>

using namespace std;

class Vendor
{
public:
        void sailbanana()
        {
                cout << "卖香蕉" << endl;
        }
        void sailapple()
        {
                cout << "卖苹果" << endl;
        }
private:
};

class Command
{
public:
        virtual void sail() = 0;
private:
};

class BananaCommand : public Command
{
public:
        BananaCommand(Vendor* v)
        {
                m_v = v;
        }
        Vendor* getV(Vendor* v)
        {
                return m_v;
        }
        void setV(Vendor* v)
        {
                m_v = v;
        }
        virtual void sail()
        {
                m_v->sailbanana();
        }
private:
        Vendor* m_v;
};

class AppleCommand : public Command
{
public:
        AppleCommand(Vendor* v)
        {
                m_v = v;
        }
        Vendor* getV(Vendor* v)
        {
                return m_v;
        }
        void setV(Vendor* v)
        {
                m_v = v;
        }
        virtual void sail()
        {
                m_v->sailapple();
        }
private:
        Vendor* m_v;
};

class Waiter
{
public:
        Command* getCommand()
        {
                return m_command;
        }
        void setCommand(Command* c)
        {
                m_command = c;
        }
        void sail()
        {
                m_command->sail();
        }
private:
        Command* m_command;
};

class AdvWaiter
{
public:
        AdvWaiter()
        {
                m_list = new list<Command*>;
                m_list->resize(0);
        }
        ~AdvWaiter()
        {
                delete m_list;
        }
        void setCommands(Command* c)
        {
                m_list->push_back(c);
        }
        list<Command*>* getCommands()
        {
                return m_list;
        }
        void sail()
        {
                for (list<Command*>::iterator it = m_list->begin(); it != m_list->end(); it++)
                {
                        (*it)->sail();
                }
        }
private:
        list<Command*>* m_list;
};


int main()
{
        //小商贩直接卖水果
        cout << "小商贩直接卖水果" << endl;
        Vendor* v1 = new Vendor;
        v1->sailapple();
        v1->sailbanana();
        delete v1;
        cout << "----------------------" << endl;

        //小商贩通过命令卖水果
        cout << "小商贩通过命令卖水果" << endl;
        Vendor* v2 = new Vendor;
        AppleCommand* ac1 = new AppleCommand(v2);
        ac1->sail();
        BananaCommand* bc1 = new BananaCommand(v2);
        bc1->sail();
        delete bc1;
        delete ac1;
        delete v2;
        cout << "----------------------" << endl;

        //小商贩通过服务员卖水果
        cout << "小商贩通过服务员卖水果" << endl;
        Vendor* v3 = new Vendor;
        AppleCommand* ac2 = new AppleCommand(v3);
        BananaCommand* bc2 = new BananaCommand(v3);
        Waiter* w1 = new Waiter;
        w1->setCommand(ac2);
        w1->sail();
        w1->setCommand(bc2);
        w1->sail();
        delete w1;
        delete bc2;
        delete ac2;
        delete v3;
        cout << "----------------------" << endl;

        //小商贩通过advwaiter批量下单 卖水果
        cout << "小商贩通过advwaiter批量下单 卖水果" << endl;
        Vendor* v4 = new Vendor;
        AppleCommand* ac3 = new AppleCommand(v4);
        BananaCommand* bc3 = new BananaCommand(v4);
        AdvWaiter* w2 = new AdvWaiter;
        w2->setCommands(ac3);
        w2->setCommands(bc3);
        w2->sail();
        delete w2;
        delete bc3;
        delete ac3;
        delete v4;
        cout << "----------------------" << endl;

        return 0;
}
  • 输出
小商贩直接卖水果
卖苹果
卖香蕉
----------------------
小商贩通过命令卖水果
卖苹果
卖香蕉
----------------------
小商贩通过服务员卖水果
卖苹果
卖香蕉
----------------------
小商贩通过advwaiter批量下单 卖水果
卖苹果
卖香蕉
----------------------

版权属于:zfh

本文链接:http://zfhblog.com/index.php/archives/141/



评论已关闭