命令模式(c++實現)
阿新 • • 發佈:2020-07-15
# 命令模式
[TOC]
## 模式定義
**命令模式(Command)**,將一個請求封裝為一個物件,從而使你可用不同的請求對客戶進行引數化;對請求排隊或記錄請求日誌,以及支援可撤銷的操作。
## 模式動機
- 敏捷開發的原則告訴我們,不要為程式碼新增基於猜測的、實際不需要的功能。如果不清楚一個系統是否需要命令模式,一般就不要著急去實現它,事實上,在需要的時候通過重構實現這個模式並不困難,只有在真正需要如撤銷/恢復操作等功能時,把原來的程式碼重構為命令模式才有意義。
## UML類圖
![](https://files-cdn.cnblogs.com/files/wzxNote/%E5%91%BD%E4%BB%A4%E6%A8%A1%E5%BC%8F.bmp)
## 原始碼實現
- command.h
```c++
#include "chef.h"
class Command
{
public:
Command(Chef* chef);
virtual ~Command();
virtual void ExcuteCmd();
protected:
Chef* m_Chef;
};
```
- chef.h
```c++
class Chef
{
public:
Chef();
void KungPaoChicken();
void FishFlavoredShreddedPork();
void BigPlateChicken();
};
```
- chef.cpp
```c++
#include "chef.h"
#include
Chef::Chef()
{
}
void Chef::KungPaoChicken()
{
std::cout << "宮保雞丁" << std::endl;
}
void Chef::FishFlavoredShreddedPork()
{
std::cout << "魚香肉絲" << std::endl;
}
void Chef::BigPlateChicken()
{
std::cout << "大盤雞" << std::endl;
}
```
- kungpaochickencmd.h
```c++
#include "command.h"
#include "chef.h"
class KungPaoChickenCmd : public Command
{
public:
KungPaoChickenCmd(Chef* chef);
void ExcuteCmd() override;
};
```
- kungpaochickencmd.cpp
```c++
#include "kungpaochickencmd.h"
KungPaoChickenCmd::KungPaoChickenCmd(Chef* chef)
:Command(chef)
{
}
void KungPaoChickenCmd::ExcuteCmd()
{
m_Chef->KungPaoChicken();
}
```
- waiter.h
```c++
#include
-
#include