行为型模式-命令(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
- Command命令(行为型模式)
- 行为型模式-命令command
- 行为型模式-命令(command)
- 行为型模式-----命令模式(Command)
- [设计模式-行为型]命令模式(Command)
- 行为型模式-Command ( 命令模式 )
- 行为型模式:命令模式(Command Pattern)
- COMMAND 命令模式 --对象行为型模式
- 十四、命令模式Command(行为型)
- 行为型模式之命令COMMAND
- 命令模式Command(对象行为型)
- 行为型-命令模式(Command)
- 行为模式:Command(命令)
- 设计模式深入学习--Command 命令模式(行为型模式)
- 设计模式之命令(Command)---对象行为型模式
- 设计模式 ( 十三 ) 命令模式Command(对象行为型)
- 设计模式 ( 十三 ) 命令模式Command(对象行为型)
- 重学设计模式 - Command(命令)模式 - 行为型
- Scala 入门基础
- json传对象与后台的获取的问题
- html —— map元素与area元素制作图像映射
- stm8s003中串口中断问题
- 浅谈Android响应式编程与Rxjava
- 行为型模式-命令(command)
- 实体类的高级应用
- MATLAB全部随机函数
- 动态规划--分段最小二乘法
- java中的多线程
- 算法导论 练习题 4.3-3
- C++(笔记)深浅拷贝and何时调用
- ①Python学习之输出菱形
- Docker基础操作命令