行为型模式-命令(command)

来源:互联网 发布:水质监测数据分析 编辑:程序博客网 时间:2024/05/21 06:53

命令

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

实例

main.cc:

#include <windows.h>#include "club_manager.h"#include "sing_command.h"#include "dance_command.h"#include "chicken_command.h"#include <iostream>using namespace std;/*design_pattern:"command"Running club needs funding, funding from sponsors, of course, the sponsor is not the volunteer, to give you the money, there will be a corresponding request,These requests will be handed out by the Club manager.request contains : sing,dance,chicken joy.*/int main(){    RunnerClub *runner_club = new RunnerClub();    Command *sing_command = new SingCommand(runner_club);    Command *dance_command = new DanceCommand(runner_club);    Command *chicken_command = new ChickenCommand(runner_club);    ClubManager *club_manager = new ClubManager();    club_manager->AddCommand(sing_command);    club_manager->AddCommand(dance_command);    club_manager->AddCommand(chicken_command);    //After a while, the sponsor thought that the scene was too noisy and called     //the club manager to cancel the singing    club_manager->DeleteCommand(sing_command);    club_manager->Action();    //clear    delete runner_club;    delete sing_command;    delete dance_command;    delete chicken_command;    delete club_manager;    system("Pause");    return 0;}

ClubManager:

//club_manager.h#ifndef HELENDP_SOURCE_CLUB_MANAGER_H_#define HELENDP_SOURCE_CLUB_MANAGER_H_#include "command.h"#include <list>using namespace std;class ClubManager{public:    ClubManager();    ~ClubManager();    void AddCommand(Command *command);    void DeleteCommand(Command *command);    void Action();private:    list<Command *> command_list_;};#endif//club_manager.cc:#include "club_manager.h"#include <iostream>using namespace std;ClubManager::ClubManager(){}ClubManager::~ClubManager(){}void ClubManager::AddCommand(Command * command){    command_list_.push_back(command);}void ClubManager::DeleteCommand(Command * command){    command_list_.remove(command);}void ClubManager::Action(){    list<Command *>::iterator iterator;    for (iterator = command_list_.begin(); iterator != command_list_.end(); ++iterator){        (*iterator)->ExcuteCommand();    }}

Command:

//command.h#ifndef HELENDP_SOURCE_COMMAND_H_#define HELENDP_SOURCE_COMMAND_H_#include "runner_club.h"class Command{public:    Command(RunnerClub *runner_club);    virtual ~Command();    virtual void ExcuteCommand();protected:    RunnerClub *runner_club_;};#endif//command.cc#include "command.h"Command::Command(RunnerClub * runner_club){    runner_club_ = runner_club;}Command::~Command(){}void Command::ExcuteCommand(){}

ChickenCommand:

//chicken_command.h#ifndef HELENDP_SOURCE_CHICKEN_COMMAND_H_#define HELENDP_SOURCE_CHICKEN_COMMAND_H_#include "command.h"class ChickenCommand : public Command{public:    ChickenCommand(RunnerClub *runner_club);    virtual ~ChickenCommand();    virtual void ExcuteCommand();protected:    RunnerClub *runner_club_;};#endif//chicken_command.cc#include "chicken_command.h"ChickenCommand::ChickenCommand(RunnerClub *runner_club)    :Command(runner_club){}ChickenCommand::~ChickenCommand(){}void ChickenCommand::ExcuteCommand(){    runner_club_->CosplayChicken();}

DanceCommand:

//dance_command.h#ifndef HELENDP_SOURCE_DANCE_COMMAND_H_#define HELENDP_SOURCE_DANCE_COMMAND_H_#include "command.h"class DanceCommand : public Command{public:    DanceCommand(RunnerClub *runner_club);    virtual ~DanceCommand();    virtual void ExcuteCommand();protected:    RunnerClub *runner_club_;};#endif//dance_command.cc#include "dance_command.h"DanceCommand::DanceCommand(RunnerClub *runner_club)    :Command(runner_club){}DanceCommand::~DanceCommand(){}void DanceCommand::ExcuteCommand(){    runner_club_->Dance();}

SingCommand:

//sing_command.h#ifndef HELENDP_SOURCE_SING_COMMAND_H_#define HELENDP_SOURCE_SING_COMMAND_H_#include "command.h"class SingCommand : public Command{public:    SingCommand(RunnerClub *runner_club);    virtual ~SingCommand();    virtual void ExcuteCommand();protected:    RunnerClub *runner_club_;};#endif//sing_command.cc#include "sing_command.h"SingCommand::SingCommand(RunnerClub *runner_club)    :Command(runner_club){}SingCommand::~SingCommand(){}void SingCommand::ExcuteCommand(){    runner_club_->Sing();}

RunnerClub:

//runner_club.h#ifndef HELENDP_SOURCE_RUNNER_CLUB_H_#define HELENDP_SOURCE_RUNNER_CLUB_H_class RunnerClub{public:    RunnerClub();    ~RunnerClub();    void Sing();    void Dance();    void CosplayChicken();};#endif//runner_club.cc#include "runner_club.h"#include <iostream>using namespace std;RunnerClub::RunnerClub(){}RunnerClub::~RunnerClub(){}void RunnerClub::Sing(){    cout << "RunnerClub Sing!" << endl;}void RunnerClub::Dance(){    cout << "RunnerClub Dance!" << endl;}void RunnerClub::CosplayChicken(){    cout << "RunnerClub CosplayChicken!" << endl;}

代码和UML图(EA)工程文件,最后会整理打包上传.

UML类图

这里写图片描述

结构

  • Command(Command):执行命令的接口.
  • ConcreteCommand(ChickenCommand,DanceCommand,SingCommand):具体执行命令的类,将接收者对象与命令绑定.
  • Invoker(ClubManager):下发命令的类.
  • Receiver(RunnerClub):命令的接收者.

优点

  • 降低系统的耦合度.
  • 新的命令可以很容易地加入到系统中.
  • 可以比较容易地设计一个命令队列和宏命令(组合命令).
  • 可以方便地实现对请求的Undo和Redo.

缺点

  • 使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用.
0 0
原创粉丝点击