行为型模型 命令模式

行为型模型 命令模式

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

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

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

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string>
#include <list>

class Vendor
{
public:
    void saleBanana()
    {
        std::cout << "卖香蕉" << std::endl;
    }
    void saleApple()
    {
        std::cout << "卖苹果" << std::endl;
    }
};

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

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 sale() override
    {
        m_v->saleBanana();
    }
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 sale() override
    {
        m_v->saleApple();
    }
private:
    Vendor * m_v;
};

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

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

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

void mytest()
{
    std::cout << "小商贩 直接 卖 水果" << std::endl;
    Vendor * v1 = new Vendor();
    v1->saleApple();
    v1->saleBanana();

    delete v1;
    v1 = nullptr;

    std::cout << "小商贩 通过命令 卖 水果" << std::endl;
    Vendor * v2 = new Vendor();
    AppleCommand * ac2 = new AppleCommand(v2);
    ac2->sale();
    BananaCommand * bc2 = new BananaCommand(v2);
    bc2->sale();

    delete bc2;
    bc2 = nullptr;
    delete ac2;
    ac2 = nullptr;
    delete v2;
    v2 = nullptr;

    std::cout << "小商贩 通过waiter 卖 水果" << std::endl;
    Vendor * v3 = new Vendor();
    AppleCommand *ac3 = new AppleCommand(v3);
    BananaCommand *bc3 = new BananaCommand(v3);
    Waiter *w3  = new Waiter();
    w3->setCommand(ac3);
    w3->sale();
    w3->setCommand(bc3);
    w3->sale();

    delete w3;
    w3 = nullptr;
    delete bc3;
    bc3 = nullptr;
    delete ac3;
    ac3 = nullptr;
    delete v3;
    v3 = nullptr;

    std::cout << "小商贩 通过advwaiter 批量下单 卖水果" << std::endl;
    Vendor * v4 = new Vendor();
    AppleCommand * ac4 = new AppleCommand(v4);
    BananaCommand * bc4 = new BananaCommand(v4);
    AdvWaiter *w4 = new AdvWaiter();
    w4->setCommands(ac4);
    w4->setCommands(bc4);
    w4->sale();

    delete v4;
    v4 = nullptr;
    delete w4;
    w4 = nullptr;
    delete bc4;
    bc4 = nullptr;
    delete ac4;
    ac4 = nullptr;
    delete v4;
    v4 = nullptr;

    return;
}

int main()
{
    mytest();

    system("pause");
    return 0;
}
时间: 2024-08-27 06:50:19

行为型模型 命令模式的相关文章

行为型模型 迭代器模式

行为型模型 迭代器模式 GOOD:提供一种方法顺序访问一个聚敛对象的各个元素,而又不暴露该对象的内部表示. 为遍历不同的聚集结构提供如开始,下一个,是否结束,当前一项等统一接口. Iterator(迭代器接口):         该接口必须定义实现迭代功能的最小定义方法集         比如提供hasNext()和next()方法. ConcreteIterator(迭代器实现类):         迭代器接口Iterator的实现类.可以根据具体情况加以实现. Aggregate(容器接口)

行为型模型 模版模式

行为型模型 模版模式 应用场景 Template Method模式一般应用在具有以下条件 的应用中:        - 具有统一的操作步骤或操作过程         - 具有不同的操作细节         - 存在多个具有同样操作步骤的应用场景,但某些具体的操作细节却各不相同总结:        在抽象类中统一操作步骤,并规定好接口:让子类实现接口.这样可以把各个具体的子类和操作步骤接耦合 AbstractClass:        抽象类的父类 ConcreteClass:         具

行为型模型 策略模式

行为型模型 策略模式 Strategy:        策略(算法)抽象. ConcreteStrategy         各种策略(算法)的具体实现. Context         策略的外部封装类,或者说策略的容器类.根据不同策略执行不同的行为.策略由外部环境决定. 好处:         //算法的实现 和 客户端的使用 解耦合         //使得算法变化,不会影响客户端 适用于:         准备一组算法,并将每一个算法封装起来,使得它们可以互换. /** * 行为型模型

行为型模型 状态模式

行为型模型 状态模式 Context:用户对象        拥有一个State类型的成员,以标识对象的当前状态: State:接口或基类         封装与Context的特定状态相关的行为: ConcreteState:接口实现类或子类         实现了一个与Context某个状态相关的行为. 适用于:         对象的行为,依赖于它所处的当前状态.行为随状态改变而改变的场景. /** * 行为型模型 状态模式 * State模式也叫状态模式,是行为设计模式的一种. * St

行为型模型 备忘录模式

行为型模型 备忘录模式 应用场景 如果一个对象需要保存状态并可通过undo或rollback等操作恢复到以前的状态时,可以使用Memento模式. 1)一个类需要保存它的对象的状态(相当于Originator角色) 2)设计一个类,该类只是用来保存上述对象的状态(相当于Memento角色) 3)需要的时候,Caretaker角色要求Originator返回一个Memento并加以保存 4)undo或rollback操作时,通过Caretaker保存的Memento恢复Originator对象的状

设计模式(行为型)之命令模式(Command Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之策略模式(Strategy Pattern)>http://blog.csdn.net/yanbober/article/details/45498567 概述 在软件开发中,我们经常需要向某些对象发送请求(调用其中的某个或某些方法),但是并不知道请求的接收

设计模式(行为型)之模板方法模式(Template Method Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之命令模式(Command Pattern)>http://blog.csdn.net/yanbober/article/details/45500113 概述 模板方法模式是一种基于继承的代码复用,它是一种类行为型模式:是结构最简单的行为型设计模式,在其结构

行为型模型 责任链模式

行为型模型 责任链模式 Handler         处理类的抽象父类. concreteHandler         具体的处理类. 责任链优缺点 优点:         1.责任的分担.每个类只需要处理自己该处理的工作(不该处理的传递给下一个对象完成),明确各类的责任范围,符合类的最小封装原则.         2.可以根据需要自由组合工作流程.如工作流程发生变化,可以通过重新分配对象链便可适应新的工作流程.         3.类与类之间可以以松耦合的形式加以组织.缺点:      

第16章 行为型模式—命令模式

1. 命令模式(Command Pattern)的定义 (1)定义 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作. ①封装请求:抽象出需要执行的动作,封装成对象(有统一的接口). ②参数化:可以用不同的命令对象,去参数化配置客户的请求.(即,将命令对象作为参数去供Invoker调用). (2)命令模式的结构和说明 ①Command:定义命令的接口,声明执行的方法 ②ConcreteCommand:命令接口实现对象,是“虚”的实现