網(wǎng)站子目錄是什么意思百度ai智能寫作工具
概念
命令模式是一種行為設(shè)計(jì)模式,它的核心思想就是將請(qǐng)求封裝為一個(gè)對(duì)象,此對(duì)象包含與請(qǐng)求相關(guān)的所有信息??梢杂貌煌恼?qǐng)求對(duì)客戶進(jìn)行參數(shù)化。命令模式通過將請(qǐng)求的發(fā)送者和接收者解耦,支持請(qǐng)求的排隊(duì)、記錄、撤銷等操作。
使用場景
1、如果需要通過參數(shù)來操作對(duì)象,可以使用命令模式。
2、如果想要把操作放入到對(duì)象中進(jìn)行操作執(zhí)行或者遠(yuǎn)程執(zhí)行操作就需要命令模式。
3、如果想要實(shí)現(xiàn)操作回滾操作,就需要用到命令模式。
實(shí)現(xiàn)方式
1、使用命令模式需要至少創(chuàng)建三個(gè)類,一個(gè)命令的接口類,一個(gè)是命令的調(diào)用類,一個(gè)實(shí)際接受者對(duì)象(簡單命令可以沒有);
2、創(chuàng)建一個(gè)僅有一個(gè)執(zhí)行方法的命令接口。通過繼承命令接口創(chuàng)建一系列不同的具體命令類,具體命令類中實(shí)現(xiàn)方法。每個(gè)具體的命令類必須保存請(qǐng)求參數(shù)和實(shí)際接受者對(duì)象的引用。所有的變量只能在構(gòu)造函數(shù)中進(jìn)行初始化。
3、創(chuàng)建命令的調(diào)用類,也是發(fā)送命令的類,在這些類中添加保存命令的成員變量,發(fā)生者只能通過命令接口與其命令進(jìn)行交互,發(fā)送者本身不創(chuàng)建對(duì)象,命名對(duì)象是通過參數(shù)設(shè)置到調(diào)用類的。
4、客戶端的初始化。
? 1)創(chuàng)建接受者
? 2)創(chuàng)建命令,有需要的話可以關(guān)聯(lián)接受者對(duì)象。
? 3)創(chuàng)建發(fā)送者,需要將命令進(jìn)行關(guān)聯(lián)(也就是將命令設(shè)置到發(fā)送者)。
類結(jié)構(gòu)圖
示例代碼
#include "MingLingMoShi.h"int main()
{std::cout << "歡迎東哥來到設(shè)計(jì)模式的世界!\n";//創(chuàng)建命令對(duì)象CommandBase* command = new ConcreteCommend();CommandBase* command1 = new ConcreteCommend1();//創(chuàng)建調(diào)用者Invoker invoker;invoker.setCommend(command);invoker.execte();invoker.setCommend(command1);invoker.execte();
}
#pragma once
#include <iostream>
using namespace std;//接受者類
class Receiver {
public:Receiver() {}~Receiver() {}void execte() {cout << "Receiver 接收者對(duì)象執(zhí)行操作函數(shù)" << endl;}
};//命令基類
class CommandBase
{
public:CommandBase() {}~CommandBase() {}virtual bool execte() = 0;
};//具體命令,不使用接受者
class ConcreteCommend : public CommandBase {
public:ConcreteCommend() {}~ConcreteCommend() {}bool execte() {cout << "ConcreteCommend 沒有使用接受者的命令對(duì)象" << endl;return true;}
};//具體命令,使用接受者
class ConcreteCommend1 : public CommandBase {
public:ConcreteCommend1() {}~ConcreteCommend1() {}bool execte() {cout << "ConcreteCommend1 使用接受者的命令對(duì)象" << endl;m_receiver = new Receiver();m_receiver->execte();return true;}
private:Receiver* m_receiver;
};//調(diào)用者
class Invoker {
public:Invoker() {}~Invoker() {}void setCommend(CommandBase * command) {m_command = command;}void execte() {m_command->execte();}
private:CommandBase* m_command;};