????????命令模式,它將請(qǐng)求封裝成一個(gè)對(duì)象,從而允許客戶端參數(shù)化操作隊(duì)列、記錄請(qǐng)求日志、支持撤銷操作等。在命令模式中,有四個(gè)核心角色:命令接口(Command)、具體命令(ConcreteCommand)、調(diào)用者(Invoker)、接收者(Receiver)。
① 命令接口(Command):聲明了執(zhí)行命令的方法,是命令對(duì)象的抽象表示。
② 具體命令(ConcreteCommand):實(shí)現(xiàn)了命令接口,具體定義了要執(zhí)行的操作。
③ 調(diào)用者(Invoker):負(fù)責(zé)調(diào)用命令對(duì)象執(zhí)行請(qǐng)求,它并不知道具體的命令細(xì)節(jié),只知道調(diào)用命令對(duì)象的方法來(lái)完成請(qǐng)求。
④ 接收者(Receiver):負(fù)責(zé)實(shí)際執(zhí)行命令指定的操作。
命令模式的核心思想是將請(qǐng)求的發(fā)送者與請(qǐng)求的接收者解耦,通過(guò)命令對(duì)象將二者進(jìn)行綁定。這樣可以實(shí)現(xiàn)對(duì)請(qǐng)求的封裝、記錄、排隊(duì)和撤銷操作等功能。
1、場(chǎng)景設(shè)計(jì)
實(shí)現(xiàn)場(chǎng)景:請(qǐng)求者發(fā)出命令,接收者接收命令并執(zhí)行一個(gè)動(dòng)作。
2、C++實(shí)現(xiàn)
`Command` 是命令接口,定義了一個(gè)純虛的 `execute()` 方法。`ConcreteCommand` 是具體命令,實(shí)現(xiàn)了 `Command` 接口,并在 `execute()` 方法中調(diào)用了接收者的 `action()` 方法。`Receiver` 是接收者,負(fù)責(zé)實(shí)際執(zhí)行命令指定的操作。`Invoker` 是調(diào)用者,負(fù)責(zé)維護(hù)一系列命令,并負(fù)責(zé)調(diào)用這些命令執(zhí)行請(qǐng)求。在 `main()` 函數(shù)中,我們創(chuàng)建了一個(gè)接收者、一個(gè)具體命令和一個(gè)調(diào)用者,并將具體命令添加到調(diào)用者中執(zhí)行。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-847358.html
#include <iostream>
#include <vector>
// 命令接口
class Command {
public:
virtual void execute() = 0;
};
// 接收者
class Receiver {
public:
void action() {
std::cout << "Receiver: Executing action" << std::endl;
}
};
// 具體命令
class ConcreteCommand : public Command {
private:
class Receiver *receiver;
public:
ConcreteCommand(class Receiver *recv) : receiver(recv) {}
void execute() override {
receiver->action();
}
};
// 調(diào)用者
class Invoker {
private:
std::vector<Command *> commands;
public:
void addCommand(Command *cmd) {
commands.push_back(cmd);
}
void executeCommands() {
for (Command *cmd : commands) {
cmd->execute();
}
commands.clear();
}
};
int main() {
Receiver *receiver = new Receiver();
Command *command = new ConcreteCommand(receiver);
Invoker *invoker = new Invoker();
invoker->addCommand(command);
invoker->executeCommands();
delete receiver;
delete command;
delete invoker;
return 0;
}
3、Java實(shí)現(xiàn)
`Command` 是命令接口,定義了一個(gè) `execute()` 方法。`ConcreteCommand` 是具體命令,實(shí)現(xiàn)了 `Command` 接口,并在 `execute()` 方法中調(diào)用了接收者的 `action()` 方法。`Receiver` 是接收者,負(fù)責(zé)實(shí)際執(zhí)行命令指定的操作。`Invoker` 是調(diào)用者,負(fù)責(zé)調(diào)用命令對(duì)象執(zhí)行請(qǐng)求。在 `main()` 方法中,我們創(chuàng)建了一個(gè)接收者、一個(gè)具體命令和一個(gè)調(diào)用者,并將具體命令綁定到調(diào)用者上執(zhí)行。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-847358.html
package behavioralpattern.command;
public class CommandDemo {
// 命令接口
interface Command {
void execute();
}
// 具體命令
static class ConcreteCommand implements Command {
private Receiver receiver;
ConcreteCommand(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
receiver.action();
}
}
// 接收者
static class Receiver {
void action() {
System.out.println("Receiver: Executing action");
}
}
// 調(diào)用者
static class Invoker {
private Command command;
void setCommand(Command command) {
this.command = command;
}
void executeCommand() {
command.execute();
}
}
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command command = new ConcreteCommand(receiver);
Invoker invoker = new Invoker();
invoker.setCommand(command);
invoker.executeCommand();
}
}
到了這里,關(guān)于設(shè)計(jì)模式(016)行為型之命令模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!