1.1. 行为模型:命令模式
如看电视时,我们只需要轻轻一按遥控器就能完成频道的切换,这就是命令模式,将换台请求和换台处理完全解耦了。电视机遥控器(命令发送者)通过按钮(具体命令)来遥控电视机(命令接收者)。
1.1.1. 定义与特点
- 定义:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。
- 优点:
- 引入抽象接口降低系统耦合度
- 扩展性好,增加或删除命令非常方便。采用命令模式增加与删除命令不会影响其他类,且满足“开闭原则”。
- 可与多种设计模式组合,如结合备忘录模式,实现命令的撤销与恢复;结合装饰器模式,更加灵活增加日志记录
- 缺点:
- 抽象命令类(command):声明执行命令的接口,拥有抽象方法execute()
- 具体命令类(concrete command):抽象命令类的具体实现类,它拥有接收者对象,并通过调用接收者的功能来完成命令要执行的操作
- 实现者/接收者(Receiver):执行命令功能的相关操作,是具体命令对象业务的真正实现者。
- 调用者/请求者(Invoker):请求的发送者,它通常拥有很多的命令对象,并通过访问命令对象来执行相关请求,它不直接访问接收者
模式的代码实现
代码 示例:增加日志操作
- 对外模板调用方法:
RecordLogTemplate.class
import org.springframework.stereotype.Component; /** * @author lvite */ @Component public class RecordLogTemplate { /** * 添加日志 */ public void addLog() { AbstractLogCommand cmd = new ConcreteLogCommand(); LogInvoker logInvoker = new LogInvoker(cmd); logInvoker.call(); } }
抽象命令类
AbstractLogCommand.class
```java /**@author lviter 日志抽象命令模式 */ public abstract class AbstractLogCommand {
/**
- 记录日志 */ public abstract void recordLog();
}
- 抽象命令的具体实现`ConcreteLogCommand.class`
```java
import org.springframework.stereotype.Component;
/**
* @author lviter 命令模式实际实现
*/
@Component
public class ConcreteLogCommand extends AbstractLogCommand {
@Override
public void recordLog() {
LogReceiver logReceiver = new LogReceiver();
logReceiver.addLog();
}
}
日志实际调用者
LogInvoker.class
/** * @author lviter 记录日志调用者 */ public class LogInvoker { private AbstractLogCommand abstractLogCommand; public LogInvoker(AbstractLogCommand abstractLogCommand) { this.abstractLogCommand = abstractLogCommand; } public void call() { abstractLogCommand.recordLog(); } }
- 日志实现
LogReceiver.class
```java
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component;
/**
@author lviter 写日志实现 */ @Component public class LogReceiver {
private static Logger log = LoggerFactory.getLogger(LogReceiver.class);
public void addLog() {
log.info("============================写日志操作========================");
}
}
```