前端开发设计模式-命令模式:解耦对象与方法调用

91 阅读2分钟

本文将探讨命令模式,一种在面向对象编程中用于解耦对象和方法调用的设计模式。

命令模式的应用场景

假设我们有一个在线外卖平台,用户可以在平台上进行下单、追踪订单和取消订单。

class OrderManager() {
  constructor() {
    this.orders = []
  }

  placeOrder(order, id) {
    this.orders.push(id)
    return `You have successfully ordered ${order} (${id})`;
  }

  trackOrder(id) {
    return `Your order ${id} will arrive in 20 minutes.`
  }

  cancelOrder(id) {
    this.orders = this.orders.filter(order => order.id !== id)
    return `You have canceled your order ${id}`
  }
}

OrderManager 类中,我们可以直接调用 placeOrdertrackOrdercancelOrder 方法。

const manager = new OrderManager();

manager.placeOrder("Pad Thai", "1234");
manager.trackOrder("1234");
manager.cancelOrder("1234");

然而,这种直接调用方法的方式存在一些弊端。例如,如果我们决定重命名某些方法,或者更改方法的功能,那么我们需要修改所有调用这些方法的地方。

解耦方法调用

为了解决这个问题,我们可以使用命令模式。命令模式将方法调用封装成独立的命令对象,并通过一个统一的接口来执行这些命令。

首先,我们需要重构 OrderManager 类,将 placeOrdercancelOrdertrackOrder 方法替换为一个 execute 方法,该方法接受一个命令对象作为参数并执行该命令。

class Command {
  constructor(execute) {
    this.execute = execute;
  }
}

function PlaceOrderCommand(order, id) {
  return new Command((orders) => {
    orders.push(id);
    return `You have successfully ordered ${order} (${id})`;
  });
}

function CancelOrderCommand(id) {
  return new Command((orders) => {
    orders = orders.filter((order) => order.id !== id);
    return `You have canceled your order ${id}`;
  });
}

function TrackOrderCommand(id) {
  return new Command(() => `Your order ${id} will arrive in 20 minutes.`);
}

每个命令对象都包含一个 execute 方法,该方法接受 orders 数组作为参数,并执行相应的操作。

命令模式的优势

使用命令模式可以带来以下优势:

  • 解耦对象和方法调用: 命令模式将方法调用封装成独立的命令对象,从而解耦对象和方法调用,使得代码更加灵活和易于维护。
  • 支持撤销和重做: 命令模式可以轻松实现撤销和重做功能,只需记录执行过的命令,然后反向执行即可。
  • 扩展性强: 可以方便地添加新的命令,而无需修改原有代码。

通过使用命令模式,我们可以有效地解耦对象和方法调用,提高代码的灵活性和可维护性。

现在前端设计中,出现过很多的命令模式,评论区说说哪些库的那些功能有用到吧!

参考资料:
Command Pattern