1.命令模式的定义(百度百科)
在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。将一组行为抽象为对象,实现二者之间的松耦合。
从上面的描述中,我们可以看出,命令模式解决的是请求和实现紧耦合的问题。
2.案例
我们模拟一个早上起床、刷牙的场景。
3.命令模式的实现
3.1定义命令抽象接口
public interface Command<T> {
T execute();
}
3.2 定义命令接收者
public abstract class Receiver<T> implements Command<T> {
}
public class GetUpReceiver extends Receiver<String> {
private Map<String, Object> params;
public GetUpReceiver(Map<String, Object> params) {
this.params = params;
}
@Override
public String execute() {
System.out.println("执行起床命令");
return null;
}
}
public class BrushReceiver extends Receiver<String> {
private Map<String, Object> params;
public BrushReceiver(Map<String, Object> params) {
this.params = params;
}
@Override
public String execute() {
System.out.println("执行刷牙命令");
return null;
}
}
3.3实现起床、刷牙命令
public class GetUpCommand implements Command<String> {
private Receiver receiver;
public GetUpCommand(Receiver receiver) {
this.receiver = receiver;
}
@Override
public String execute() {
return (String)receiver.execute();
}
}
public class BrushCommand implements Command<String> {
private Receiver receiver;
public BrushCommand(Receiver receiver) {
this.receiver = receiver;
}
@Override
public String execute() {
return (String) receiver.execute();
}
}
3.4 定义请求对象
public class Invoker {
private List<Command> commands = new ArrayList<>();
public Invoker addCommand(Command command) {
commands.add(command);
return this;
}
public void executeCommand() {
for (Command command : commands) {
command.execute();
}
}
}
3.5 客户端调用
public class Client {
public static void main(String[] args) {
//起床
GetUpCommand getUpCommand = new GetUpCommand(new GetUpReceiver(new HashMap<>()));
//刷牙
BrushCommand brushCommand = new BrushCommand(new BrushReceiver(new HashMap<>()));
Invoker invoker = new Invoker();
invoker.addCommand(getUpCommand)
.addCommand(brushCommand);
invoker.executeCommand();
}
}
4. 命令模式总结
一般包含3个角色
- command:命令抽象接口
- receiver:命令接收者
- invoker:请求者,组装命令
命令模式与与策略模式的区别
- 策略模式强调的是达成同一目标的不同实现,比如去上班,有多种路线,但最终的目的是上班。
- 命令模式强调的是做不同的事情,隐藏不同的实现,比如起床、刷牙、上班等。