1.1. 行为模型:命令模式

如看电视时,我们只需要轻轻一按遥控器就能完成频道的切换,这就是命令模式,将换台请求和换台处理完全解耦了。电视机遥控器(命令发送者)通过按钮(具体命令)来遥控电视机(命令接收者)。

1.1.1. 定义与特点

  • 定义:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。
  • 优点:
    • 引入抽象接口降低系统耦合度
    • 扩展性好,增加或删除命令非常方便。采用命令模式增加与删除命令不会影响其他类,且满足“开闭原则”。
    • 可与多种设计模式组合,如结合备忘录模式,实现命令的撤销与恢复;结合装饰器模式,更加灵活增加日志记录
  • 缺点:
    • 增加系统的复杂性

      1.1.2. 模式结构与实现

      模式结构

      包含以下主要角色:
  • 抽象命令类(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("============================写日志操作========================");
    

    }

}

```

Copyright & copy lviter@163.com            updated 2024-02-06 09:54:55

results matching ""

    No results matching ""