Java设计模式--命令模式(Command)

概述


  • 命令模式可以将请求发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。
  • 定义:将一个请求封装为一个对象,从而让我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。
  • 也叫为动作(Action)模式或事务(Transaction)模式。
  • 命令模式是一种对象行为型模式。
  • 学习难度:★★★☆☆
  • 使用频率:★★★★☆

优缺点


  • 优点
    • 类间解耦:调用者和接受者没有依赖,命令角色的execute()来处理具体的调用
    • 可扩展:Command子类,具体命令角色非常容易扩展
  • 缺点
    • 命令多了具体命令角色的膨胀

类图


在这里插入图片描述

组成角色


  • 接受者角色(Receiver)
  • 命令角色(Command)
  • 具体命令角色(ConcreteCommand)
  • 调用者角色(Invoker)

Code Example


接受者角色(Receiver)
  • 请求最终接受并处理的角色
/**
 * 接收者:知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接收者。
 * 
 * @author yanbin
 * 
 */
public class Receiver {

   public void turnOn() {
      System.out.println("灯开了!");
   }

   public void turnOff() {
      System.out.println("灯关了!");
   }

}
命令角色(Command)
  • 声明执行操作的接口
/**
 * 命令角色(抽象类或接口):声明执行操作的接口。有java 接口或者抽象类来实现
 * 
 * @author yanbin
 * 
 */
public interface Command {

   /**
    * 命令执行方法
    */
   public void execute();

}
具体命令角色(ConcreteCommand)
  • 请求命令对象化,就是指该角色
  • 具体命令角色拥有接受者角色,方便命令对象调用接受者角色执行命令
/**
 * 具体命令对象
 * 
 * @author yanbin
 * 
 */
public class TurnOffCommand implements Command {

   private Receiver receiver;

   public TurnOffCommand(Receiver receiver) {
      this.receiver = receiver;
   }

   /**
    * 执行命令
    */
   public void execute() {
      receiver.turnOff();
   }

}
/**
 * 具体命令角色:将一个接收者对象绑定于一个动作;调用接收 者相应的操作,以实现命令角色声明的执行操作的接口。
 * 
 * @author yanbin
 * 
 */
public class TurnOnCommand implements Command {

   private Receiver receiver;

   public TurnOnCommand(Receiver receiver) {
      this.receiver = receiver;
   }

   /**
    * 执行命令
    */
   public void execute() {
      receiver.turnOn();
   }

}
调用者角色(Invoker)
  • 接受到命令,并调用具体的命令,有种调度的作用
  • 调用者角色拥有所有的命令对象
/**
 * 请求调用者:调用命令对象执行这个请求。
 * 
 * @author yanbin
 * 
 */
public class Invoker {

   private Command turnOffCommand;
   private Command turnOnCommand;

   public Command getTurnOffCommand() {
      return turnOffCommand;
   }

   public void setTurnOffCommand(Command turnOffCommand) {
      this.turnOffCommand = turnOffCommand;
   }

   public Command getTurnOnCommand() {
      return turnOnCommand;
   }

   public void setTurnOnCommand(Command turnOnCommand) {
      this.turnOnCommand = turnOnCommand;
   }

   public void turnUp() {
      turnOnCommand.execute();
   }

   public void turnDown() {
      turnOffCommand.execute();
   }
}
客户端
/**
 * 客户角色:创建一个具体命令对象(并可以设定它的接收者)。
 * 
 * @author yanbin
 * 
 */
public class Client {

   public static void main(String[] args) {
      Receiver receiver = new Receiver();
      Command turnOn = new TurnOnCommand(receiver);
      Command trunOff = new TurnOffCommand(receiver);

      Invoker invoker = new Invoker();
      invoker.setTurnOnCommand(turnOn);
      invoker.setTurnOffCommand(trunOff);

      Scanner scanner = new Scanner(System.in);
      String input = scanner.next();

      try {
         if ("ON".equals(input)) {
            invoker.turnUp();
         } else if ("OFF".equals(input)) {
            invoker.turnDown();
         } else {
            System.out.println("Argument \"ON\" or \"OFF\" is required.");
         }
      } catch (Exception e) {
         System.out.println("Arguments required.");
      }
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值