命令模式:对命令的封装,每一个命令都是一个操作,请求方发出请求,接收方接收请求,并执行操作。命令模式解耦了请求方和接收方,命令模式属于行为型模式
命令模式与策略模式的区别:
策略模式的意图是封装算法,它认为“算法”已经是一个完整的、不可拆分的原子业务,即其意图是让这些算法独立,并且可以相互替换,让行为的变化独立于拥有行为的客户。例如从北京到南京可以坐飞机、高铁、火车。方式不同但结果一样。
命令模式则是对动作的解耦,把一个动作的执行分为执行对象(接收者角色)、执行行为(命令角色),让两者相互独立而不相互影响。
命令模式中的4个角色:
- 接收者角色(Receiver):负责具体执行一个请求
- 命令角色(ICommand):定义需要执行的所有命令行为
- 具体的命令角色(ConcreteCommand):内部维护一个Receiver
- 请求者角色(Invoker):接收客户端的命令,并执行命令
图片解析:
command:命令接口
openCommand、changeCommand、closeCommand:具体的命令
TV:命令接收者
Control:请求者角色
创建具体的命令对象(openCommand),构造器注入TV对象
请求者角色Control构造器注入具体的命令角色(openCommand)
/**
* 功能:操作命令
*/
public interface Command {
void execute();
}
/**
* 功能:打开电视机
*/
public class OpenCommand implements Command{
private TV tv = new TV();
@Override
public void execute() {
tv.open();
}
}
/**
* 功能:换台
*/
public class ChangeCommand implements Command{
private TV tv = new TV();
@Override
public void execute() {
tv.change();
}
}
/**
* 功能:关闭电视机
*/
public class CloseCommand implements Command{
private TV tv = new TV();
@Override
public void execute() {
tv.close();
}
}
package com.kangping.command.lizi;
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(e -> e.execute());
}
}
/**
* 功能:电视机
*/
public class TV {
public void open() {
System.out.println("打开电视机");
}
public void change() {
System.out.println("切换电视机");
}
public void close() {
System.out.println("关闭电视机");
}
}
/**
* 功能:
*/
public class Tests {
public static void main(String[] args) {
Command command = new OpenCommand();
Command changeCommand = new ChangeCommand();
Command closeCommand = new CloseCommand();
List list = new ArrayList<>();
list.add(command);
list.add(changeCommand);
list.add(closeCommand);
Control control = new Control(list);
control.action();
}
}