命令模式(Command Pattern)也被称为行动模式(Action Pattern)、事物模式(Transaction Pattern),是在 GoF 23 种设计模式中定义了的行为型模式。 命令模式 是一种数据驱动的设计模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。命令是对命令的封装,每一个命令都是一个操作,请求方发出请求,接收方接收请求,并执行操作。命令模式解耦了请求方和接收方。 ~ 本篇文章内容包括:关于命令模式、命令模式 Demo
命令模式(Command Pattern)也被称为行动模式(Action Pattern)、事物模式(Transaction Pattern),是在 GoF 23 种设计模式中定义了的行为型模式。
命令模式 是一种数据驱动的设计模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。命令是对命令的封装,每一个命令都是一个操作,请求方发出请求,接收方接收请求,并执行操作。命令模式解耦了请求方和接收方。
命令模式主要包含以下 4 种角色:
命令模式通常适用于以下场景。
# 关于命令模式优点
# 关于命令模式缺点
我们使用遥控操作电视,电视操作包括,打开、关闭以及换台
# Command 命令(Command)角色
public interface Command {
/**
* 操作命令
*/
void execute();
}
# ConcreteCommand 具体命令(Concrete Command)角色
public class OpenCommand implements Command{
private final TV tv = new TV();
/**
* 打开电视机
*/
@Override
public void execute() {
tv.open();
}
}
public class ChangeCommand implements Command{
private final TV tv = new TV();
/**
* 换台
*/
@Override
public void execute() {
tv.change();
}
}
public class CloseCommand implements Command{
private final TV tv = new TV();
/**
* 关闭电视机
*/
@Override
public void execute() {
tv.close();
}
}
# Control 请求者(调用者)角色(Invoker)
import java.util.ArrayList;
import java.util.List;
public class Control {
public List<Command> commands = new ArrayList<>();
public Control(Command command) {
commands.add(command);
}
public Control(List<Command> commands) {
this.commands.addAll(commands);
}
public void action() {
commands.forEach(Command::execute);
}
}
# TV 接收者(Receiver)角色
public class TV {
public void open() {
System.out.println("打开电视机");
}
public void change() {
System.out.println("切换电视机");
}
public void close() {
System.out.println("关闭电视机");
}
}
import java.util.ArrayList;
import java.util.List;
public class Client {
public static void main(String[] args) {
Command command = new OpenCommand();
Command changeCommand = new ChangeCommand();
Command closeCommand = new CloseCommand();
List<Command> list = new ArrayList<>();
list.add(command);
list.add(changeCommand);
list.add(closeCommand);
Control control = new Control(list);
control.action();
}
}