一、命令设计模式简介
命令设计模式(Command Pattern)
- 请求以命令的形式包裹在对象中,并传给调⽤对象。调用对象寻找可以处理该命令的对象,并把该命令传给相应的对象执⾏命令,属于行为型模式
- 命令模式是⼀种特殊的策略模式,体现的是多个策略执⾏的问题,⽽不是选择的问题
应用场景
- 只要是你认为是命令的地⽅,就可以采⽤命令模式
- 日常每个界⾯、按钮、键盘 事件操作都是命令设计模
角色
- 抽象命令(Command):需要执⾏的所有命令都在这⾥声明
- 具体命令(ConcreteCommand):定义⼀个接收者和⾏ 为之间的弱耦合,实现execute()⽅法,负责调⽤接收者的相应操作,execute()⽅法通常叫做执⾏⽅法。
- 接受者(Receiver):负责具体实施和执⾏⼀个请求,⼲活的⻆⾊,命令传递到这⾥是应该被执⾏的,实施和执⾏请求的⽅法叫做⾏动⽅法
- 请求者(Invoker):负责调⽤命令对象执⾏请求,相关的⽅法叫做⾏动⽅法
- 客户端(Client):创建⼀个具体命令 (ConcreteCommand)对象并确定其接收者。
二、优缺点
优点:
- 调⽤者⻆⾊与接收者⻆⾊之间没有任何依赖关系,不需要了解到底是哪个接收者执⾏,降低了系统耦合度
- 扩展性强,新的命令可以很容易添加到系统中去。
缺点:
- 过多的命令模式会导致某些系统有过多的具体命令类
三、代码实现
/**
* 接收器,里面有具体的命令
*/
public class HavcReceiver {
public void on(){
System.out.println("空调开启");
}
public void off(){
System.out.println("空调关闭");
}
public void cool(){
System.out.println("空调制冷开启");
}
public void warm(){
System.out.println("空调制热开启");
}
}
/**
* 抽象命令
*/
public interface Command {
/**
* 执行动作
*/
void execute();
}
/**
* 具体命令
*/
public class OnCommand implements Command{
/**
* 对哪个命令进行处理
*/
private HavcReceiver havcReceiver;
public OnCommand(HavcReceiver havcReceiver){
this.havcReceiver = havcReceiver;
}
/**
* 执行动作
*/
@Override
public void execute() {
System.out.println("OnCommand-->execute");
havcReceiver.on();
}
}
/**
* 具体命令
*/
public class OffCommand implements Command{
/**
* 对哪个命令进行处理
*/
private HavcReceiver havcReceiver;
public OffCommand(HavcReceiver havcReceiver){
this.havcReceiver = havcReceiver;
}
/**
* 执行动作
*/
@Override
public void execute() {
System.out.println("OffCommand-->execute");
havcReceiver.off();
}
}
/**
* 具体命令
*/
public class CoolCommand implements Command{
/**
* 对哪个命令进行处理
*/
private HavcReceiver havcReceiver;
public CoolCommand(HavcReceiver havcReceiver){
this.havcReceiver = havcReceiver;
}
/**
* 执行动作
*/
@Override
public void execute() {
System.out.println("CoolCommand-->execute");
havcReceiver.cool();
}
}
/**
* 具体命令
*/
public class WarmCommand implements Command{
/**
* 对哪个命令进行处理
*/
private HavcReceiver havcReceiver;
public WarmCommand(HavcReceiver havcReceiver){
this.havcReceiver = havcReceiver;
}
/**
* 执行动作
*/
@Override
public void execute() {
System.out.println("WarmCommand-->execute");
havcReceiver.warm();
}
}
/**
* 请求者,里面关联具体命令对象,包含命令方法
*/
public class AppInvoker {
private Command onCommand;
private Command offCommand;
private Command collCommand;
private Command warmCommand;
public Command getOnCommand() {
return onCommand;
}
public void setOnCommand(Command onCommand) {
this.onCommand = onCommand;
}
public Command getOffCommand() {
return offCommand;
}
public void setOffCommand(Command offCommand) {
this.offCommand = offCommand;
}
public Command getCollCommand() {
return collCommand;
}
public void setCollCommand(Command collCommand) {
this.collCommand = collCommand;
}
public Command getWarmCommand() {
return warmCommand;
}
public void setWarmCommand(Command warmCommand) {
this.warmCommand = warmCommand;
}
/**
* 开机
*/
public void on(){onCommand.execute();}
/**
* 关机
*/
public void off(){offCommand.execute();}
/**
* 制冷
*/
public void coll(){collCommand.execute();}
/**
* 制热
*/
public void warm(){warmCommand.execute();}
}
/**
*命令设计模式
*/
public class Main {
public static void main(String[] args) {
//请求者
AppInvoker appInvoker = new AppInvoker();
//接收者
HavcReceiver havcReceiver = new HavcReceiver();
appInvoker.setOnCommand(new OnCommand(havcReceiver));
appInvoker.setOffCommand(new OffCommand(havcReceiver));
appInvoker.setCollCommand(new CoolCommand(havcReceiver));
appInvoker.setWarmCommand(new WarmCommand(havcReceiver));
appInvoker.on();
appInvoker.coll();
appInvoker.warm();
appInvoker.off();
}
}
注释:个人学习观点以作笔记,如有瑕疵望谅解