设计模式——命令模式(C++)

来源:互联网 发布:php 读取文件夹 图片 编辑:程序博客网 时间:2024/05/16 12:26
/*****************************************Copyright (c) 2016 Jingshuang Hu@filename:main.cpp@datetime:2016.09.13@author:HJS@e-mail:jingshuang_hu@163.com@blog:http://blog.csdn.net/hujingshuang*****************************************/#include <iostream>#include "Invoker.h"#include "Command.h"#include "Receiver.h"using namespace std;// 命令模式的优点:// 1 降低对象之间的耦合度;// 2 可以很容易添加、撤销、恢复命令;// 3 可以很容易的设计出一个组合命令;// 4 调用同一方法(action)实现不同的功能;// 缺点:// 1 若存在过多的命令,就会导致代码中出现过多的类// client(客户端)int main() {    concreteReceiver* receiver = new concreteReceiver();                // 命令接收者    concreteCommandA* commandA = new concreteCommandA(receiver);        // 具体命令A    concreteCommandB* commandB = new concreteCommandB(receiver);        // 具体命令B    concreteCommandC* commandC = new concreteCommandC(receiver);        // 具体命令C    Invoker* invoker = new Invoker();           // 命令发起者(该对象持有许多命令,具有添加、撤销、恢复命令的功能)        invoker->addCommand(commandA);              // 添加命令A    invoker->addCommand(commandB);              // 添加命令B    invoker->addCommand(commandC);              // 添加命令C    invoker->action();                          // 执行所有命令    invoker->undoCommand(commandA);             // 撤销命令A    invoker->action();                          // 执行所有命令    invoker->undoCommand(commandB);             // 撤销命令B    invoker->action();                          // 执行所有命令    invoker->redoCommand(commandA);             // 恢复命令A    invoker->action();                          // 执行所有命令    system("pause");    return 0;}// 个人理解:感觉这个模式有点像观察者模式和装饰模式的结合的味道,甚至能感觉到有一丝丝工厂方法模式的存在。
/*****************************************Copyright (c) 2016 Jingshuang Hu@filename:Receiver.h@datetime:2016.09.13@author:HJS@e-mail:jingshuang_hu@163.com@blog:http://blog.csdn.net/hujingshuang*****************************************/#ifndef _RECEIVER_H#define _RECEIVER_H// 抽象的接收者class Receiver {public:    virtual void doA() = 0;             // 接收者持有的动作A    virtual void doB() = 0;             // 接收者持有的动作B    virtual void doC() = 0;             // 接收者持有的动作C};// 具体的接收者class concreteReceiver : public Receiver {public:    virtual void doA();    virtual void doB();    virtual void doC();};#endif // _RECEIVER_H
/*****************************************Copyright (c) 2016 Jingshuang Hu@filename:Receiver.cpp@datetime:2016.09.13@author:HJS@e-mail:jingshuang_hu@163.com@blog:http://blog.csdn.net/hujingshuang*****************************************/#include "Receiver.h"#include <iostream>using namespace std;// 抽象接收者void Receiver::doA() {}void Receiver::doB() {}void Receiver::doC() {}// 具体接收者void concreteReceiver::doA() {          // 动作A    cout << "do A" << endl;}void concreteReceiver::doB() {          // 动作B    cout << "do B" << endl;}void concreteReceiver::doC() {          // 动作C    cout << "do C" << endl;}
/*****************************************Copyright (c) 2016 Jingshuang Hu@filename:Command.h@datetime:2016.09.13@author:HJS@e-mail:jingshuang_hu@163.com@blog:http://blog.csdn.net/hujingshuang*****************************************/#ifndef _COMMAND_H#define _COMMAND_H#include "Receiver.h"class Receiver;// 抽象命令class Command {public:    virtual void execute() = 0;             // 执行命令};// 具体命令Aclass concreteCommandA : public Command {private:    Receiver* receiver;public:    concreteCommandA(Receiver* receiver);    virtual void execute();};// 具体命令Bclass concreteCommandB : public Command {private:    Receiver* receiver;public:    concreteCommandB(Receiver* receiver);    virtual void execute();};// 具体命令Cclass concreteCommandC : public Command {private:    Receiver* receiver;public:    concreteCommandC(Receiver* receiver);    virtual void execute();};#endif // _COMMAND_H
/*****************************************Copyright (c) 2016 Jingshuang Hu@filename:Command.cpp@datetime:2016.09.13@author:HJS@e-mail:jingshuang_hu@163.com@blog:http://blog.csdn.net/hujingshuang*****************************************/#include "Command.h"#include <iostream>using namespace std;// 抽象命令void Command::execute() {}// 具体命令AconcreteCommandA::concreteCommandA(Receiver* receiver) {    this->receiver = receiver;}void concreteCommandA::execute() {      // 具体命令A执行动作A(命令A<------>动作A)    receiver->doA();}// 具体命令BconcreteCommandB::concreteCommandB(Receiver* receiver) {    this->receiver = receiver;}void concreteCommandB::execute() {      // 命令B<------>动作B    receiver->doB();}// 具体命令CconcreteCommandC::concreteCommandC(Receiver* receiver) {    this->receiver = receiver;}void concreteCommandC::execute() {      // 命令C<------>动作C    receiver->doC();}
/*****************************************Copyright (c) 2016 Jingshuang Hu@filename:Invoker.h@datetime:2016.09.13@author:HJS@e-mail:jingshuang_hu@163.com@blog:http://blog.csdn.net/hujingshuang*****************************************/#ifndef _INVOKER_H#define _INVOKER_H#include "Command.h"#include <list>class Command;// 命令的发起者class Invoker {private:    std::list<Command*> lst;                    // 命令池(类似于观察者模式中的观察者集合)public:    Invoker();    Invoker(Command* command);    void addCommand(Command* command);          // 添加命令    void undoCommand(Command* command);         // 撤销命令    void redoCommand(Command* command);         // 恢复命令    void action();                              // 执行所有命令    void action(Command* command);              // 执行指定命令};#endif // _INVOKER_H
/*****************************************Copyright (c) 2016 Jingshuang Hu@filename:Invoker.cpp@datetime:2016.09.13@author:HJS@e-mail:jingshuang_hu@163.com@blog:http://blog.csdn.net/hujingshuang*****************************************/#include "Invoker.h"#include <list>using namespace std;Invoker::Invoker() {}Invoker::Invoker(Command* command) {    this->addCommand(command);}// 添加命令void Invoker::addCommand(Command* command) {    lst.push_back(command);}// 撤销命令void Invoker::undoCommand(Command* command) {    lst.remove(command);}void Invoker::redoCommand(Command* command) {    this->addCommand(command);}// 执行所有命令void Invoker::action() {    list<Command*>::iterator it = lst.begin();    for (; it != lst.end(); it++) {        (*it)->execute();    }}// 执行指定命令void Invoker::action(Command* command) {    command->execute();}


这就完啦。。。

1 0
原创粉丝点击