个人公众号【爱做梦的锤子】,全网同id,个站 http://te-amo.site,欢迎关注,里面会分享更多有用知识,还有我的私密照片
文章中部分定义和解释性文字,都是引用百度百科,主要的代码及场景应用为本人原创
命令模式尝试以物件来代表实际行动。“行为请求者”与“行为实现者”通常呈现一种“紧耦合”,命令模式将一组行为抽象为对象,实现二者之间的松耦合
场景:系统的中有多个任务,都有开关功能,而且系统中任务的数量类型都不固定,要求控制所有任务开关的这个控制器,有比较好的扩展性。所以使用命令模式,就可以比较好的解决这个问题
结构
- Command:定义命令的接口,声明执行的方法。(Command)
- ConcreteCommand:命令接口实现对象,是“虚”的实现;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。(TaskStartCommand,TaskStopCommand)
- Receiver:接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。(抽象接受者:Task,具体接受者:CleanTask,StatisticsTask)
- Invoker:通常会持有命令对象,这个是客户端真正触发命令并要求命令执行相应操作的地方,相当于使用命令对象的入口。(Control)
设计
实现
代码地址:https://github.com/telundusiji/designpattern
接受者 抽象任务
@Data
public abstract class Task {
private String status;
public abstract void start();
public abstract void stop();
}
接受者 具体任务 清理任务
@Slf4j
public class CleanTask extends Task{
@Override
public void start() {
setStatus("UP");
log.info("CleanTask is working...");
}
@Override
public void stop() {
log.info("CleanTask is shutdown!");
setStatus("DOWN");
}
}
接受者 具体任务 统计任务
@Slf4j
public class StatisticsTask extends Task {
@Override
public void start() {
setStatus("UP");
log.info("StatisticsTask is working...");
}
@Override
public void stop() {
log.info("StatisticsTask is shutdown!");
setStatus("DOWN");
}
}
抽象命令
public abstract class Command {
public abstract void execute();
}
具体命令 任务开始命令
public class TaskStartCommand extends Command {
private Task task;
public TaskStartCommand(Task task) {
this.task = task;
}
@Override
public void execute() {
task.start();
}
}
具体命令 任务停止命令
public class TaskStopCommand extends Command {
private Task task;
public TaskStopCommand(Task task) {
this.task = task;
}
@Override
public void execute() {
task.stop();
}
}
命令入口
public class Control {
private Command command;
public void setCommand(Command command){
this.command = command;
}
public void action() {
if(command==null){
return;
}
this.command.execute();
}
}
优缺点
优点:
- 降低对象之间的耦合度。
- 新的命令可以很容易地加入到系统中。
- 可以比较容易地设计一个组合命令。
缺点:
- 命令类型太多就会导致命令类膨胀,所以使用该模式之前要经过全面思考,避免命令类太多膨胀,不便维护
个人公众号【爱做梦的锤子】,全网同id,个站 http://te-amo.site,欢迎关注,里面会分享更多有用知识,还有我的私密照片