15 设计模式之命令模式

目录

  • 15 设计模式之命令模式
    • 一、设计模式分类
    • 二、命令模式
      • 2.1 用途
      • 2.2 实现方式
      • 2.3 原理示意图
      • 2.4 Demo

15 设计模式之命令模式

一、设计模式分类

总体来说设计模式分为三大类:

创建型模式:工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

二、命令模式

命令模式是一种数据驱动的设计模式,将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。

2.1 用途

解决请求者和执行者之间的耦合度问题,特别需要对行为进行记录,撤销/重做或者事务处理等场景。

2.2 实现方式

  • 定义命令接口:所有命令必须实现的接口
  • 具体命令:实现命令接口的具体类,包含执行请求的方法
  • 调用者:持有命令对象并出发命令的执行
  • 接收者:实际执行命令的对象

2.3 原理示意图

15 设计模式之命令模式_第1张图片

2.4 Demo

  1. 创建一个命令接口和两个实现类
public interface Order {
   void execute();
}

public class BuyStock implements Order {
   private Stock abcStock;

   public BuyStock(Stock abcStock){
      this.abcStock = abcStock;
   }

   public void execute() {
      abcStock.buy();
   }
}

public class SellStock implements Order {
   private Stock abcStock;

   public SellStock(Stock abcStock){
      this.abcStock = abcStock;
   }

   public void execute() {
      abcStock.sell();
   }
}
  1. 创建一个请求类
public class Stock {

   private String name = "ABC";
   private int quantity = 10;

   public void buy(){
      System.out.println("Stock [ Name: "+name+",
         Quantity: " + quantity +" ] bought");
   }
   public void sell(){
      System.out.println("Stock [ Name: "+name+",
         Quantity: " + quantity +" ] sold");
   }
}
  1. 创建命令调用者
import java.util.ArrayList;
import java.util.List;

public class Broker {
   private List<Order> orderList = new ArrayList<Order>();

   public void takeOrder(Order order){
      orderList.add(order);
   }

   public void placeOrders(){
      for (Order order : orderList) {
         order.execute();
      }
      orderList.clear();
   }
}

  1. 使用 Broker 类来接受并执行命令
public class CommandPatternDemo {
   public static void main(String[] args) {
      Stock abcStock = new Stock();

      BuyStock buyStockOrder = new BuyStock(abcStock);
      SellStock sellStockOrder = new SellStock(abcStock);

      Broker broker = new Broker();
      broker.takeOrder(buyStockOrder);
      broker.takeOrder(sellStockOrder);

      broker.placeOrders();
   }
}
  1. 输出结果
Stock [ Name: ABC, Quantity: 10 ] bought
Stock [ Name: ABC, Quantity: 10 ] sold

你可能感兴趣的:(设计模式,设计模式,命令模式)