命令模式
一、介绍
命令设计模式(Command Pattern)是将请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的对象,并把该命令传给相应的对象 执行命令,属于行为型模式
命令模式是一种特殊的策略模式,体现的是多个策略执行的问题,而不是选择的问题
二、应用场景
- 只要是你认为是命令的地方,就可以采用命令模式
- 日常每个界面、按钮、键盘 事件操作都是 命令设计模式
三、角色
抽象命令(Command):需要执行的所有命令都在这里声明
具体命令(ConcreteCommand):定义一个接收者和行为之间的弱耦合,实现execute()方法,负责调用接收者的相应操作,execute()方法通常叫做执行方法。
接受者(Receiver):负责具体实施和执行一个请求,干活的角色,命令传递到这里是应该被执行的,实施和执行请求的方法叫做行动方法
请求者(Invoker):负责调用命令对象执行请求,相关的方法叫做行动方法
客户端(Client):创建一个具体命令(ConcreteCommand)对象并确定其接收者。
四、优缺点
优点
- 调用者角色与接收者角色之间没有任何依赖关系,不需要了解到底是哪个接收者执行,降低了系统耦合度
- 扩展性强,新的命令可以很容易添加到系统中去。
缺点
- 过多的命令模式会导致某些系统有过多的具体命令类
五、代码
具体执行命令类
package com.lcy.study.design.command;
/**
* @Description 空调遥控器
* @Author lcy
* @Date 2021/7/27 15:29
*/
public class ConditionReviewer {
public void on(){
System.out.println("打开空调");
}
public void off(){
System.out.println("关闭空调");
}
}
命令接口
package com.lcy.study.design.command;
/**
* @Description 命令执行接口
* @Author lcy
* @Date 2021/7/27 15:31
*/
public interface Command {
/**
* 执行命令
* @author lcy
* @date 2021/7/27 15:32
**/
void execute();
}
具体命令类
package com.lcy.study.design.command;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* @Description 打开空调命令
* @Author lcy
* @Date 2021/7/27 15:31
*/
@AllArgsConstructor
public class OnCommand implements Command{
/**
* 遥控器
*/
private final ConditionReviewer conditionReviewer;
@Override public void execute(){
System.out.println("OnCommand -> execute");
conditionReviewer.on();
}
}
package com.lcy.study.design.command;
import lombok.AllArgsConstructor;
/**
* @Description 打开空调命令
* @Author lcy
* @Date 2021/7/27 15:31
*/
@AllArgsConstructor
public class OffCommand implements Command{
/**
* 遥控器
*/
private final ConditionReviewer conditionReviewer;
@Override public void execute(){
System.out.println("OffCommand -> execute");
conditionReviewer.off();
}
}
命令执行类
package com.lcy.study.design.command;
/**
* @Description 命令执行者
* @Author lcy
* @Date 2021/7/27 15:38
*/
public class Invoker {
private Command onCommand;
private Command offCommand;
public void setOnCommand(Command onCommand){
this.onCommand = onCommand;
}
public void setOffCommand(Command offCommand){
this.offCommand = offCommand;
}
/**
* 开机
*/
public void on(){
onCommand.execute();
}
/**
* 关机
*/
public void off(){
offCommand.execute();
}
public static void main(String[] args){
ConditionReviewer conditionReviewer = new ConditionReviewer();
Command onCommand= new OnCommand(conditionReviewer);
Command offCommand= new OffCommand(conditionReviewer);
Invoker invoker = new Invoker();
invoker.setOnCommand(onCommand);
invoker.setOffCommand(offCommand);
invoker.on();
invoker.off();
}
}