行为型模式之命令模式实现

概念

命令模式是行为设计模式的一种。命令模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数。

在面向对象的程序设计中,一个对象调用另一个对象,一般情况下的调用过程是:创建目标对象实例;设置调用参数;调用目标对象的方法。

但在有些情况下必须要使用一个专门的类对这种调用过程加以封装,我们把这种专门的类称作command类。整个调用过程比较繁杂,或者存在多处这种调用。这时,使用Command类对该调用加以封装,便于功能的再利用。

调用前后需要对调用参数进行某些处理。调用前后需要进行某些额外处理,比如日志,缓存,记录历史操作等。

角色和职责

命令模式
Command:Command命令的抽象类;
ConcreteCommand: Command的具体实现类;
Receiver: 需要被调用的目标对象;
Invorker: 通过Invorker执行Command对象。

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

案例

#include <iostream>
using namespace std;

class Vendor 
{
public:
    void sailBanana()
    {
        cout << "卖香蕉" << endl;
    }

    void sailApple()
    {
        cout << "卖苹果" << endl;
    }
};

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

class BananaCommand:public Command
{
public:
    BananaCommand(Vendor *v)
    {
        m_v = v;
    }

    Vendor *getV()
    {
        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()
    {
        return Vendor;
    }

    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;
    }

    list<Command *> *getCommand()
    {
        return list;
    }

    void setCommand(Command *c)
    {
        m_list->push_back(c);
    }

    void sail()
    {
        for(list<Command *>::iterator it = m_list->begin(); it != m_list->end(); it++)
        {
            (*it)->sail();
        }
    }

private:
    list<Command *> *m_list;
};

//小商贩 **直接** 卖 水果
void main1()
{
    Vendor *v = new Vendor();
    v->sailApple();
    v->sailBanana();

    delete v;
    return;
}

//小商贩 **通过命令** 卖 水果
void main2()
{
    Vendor *v = new Vendor();
    AppleCommand *ac = new AppleCommand(v);
    ac->sail();

    BananaCommand *bc = new BananaCommand (v);
    ac->sail();

    delete bc;
    delete ac;
    delete v;
}

//小商贩 **通过wait** 卖 水果
void main3()
{
    Vendor *v = new Vendor();
    AppleCommand *ac = new AppleCommand(v);
    BananaCommand *bc = new BananaCommand(v);

    Waiter *w = new Waiter();
    w->setCommand(ac);
    w->sail();

    w->setCommand(bc);
    w->sail();

    delete w;
    delete bc;
    delete ac;
    delete v;
}

//小商贩 **通过AdvWait** 卖 水果
void main4()
{
    Vendor *v = new Vendor();
    AppleCommand *ac = new AppleCommand(v);
    BananaCommand *bc = new BananaCommand(v);

    AdvWaiter *w = new AdvWaiter();
    w->setCommand(ac);
    w->setCommand(bc);
    w->sail();

    delete w;
    delete bc;
    delete ac;
    delete v;
}

int main(void)
{
    //main1();
    //main2();
    //main4();
    main4();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tingzhushaohua

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值