命令模式(Command Pattern)

顾名思义,这是一种接受命令再统一执行的模式。

命令模式的实例

比如在股票的买卖中可以买和卖,但是这是一个执行就实施的操作,不利于挂单。

  1. class Stock {
  2. constructor() {
  3. this.name = "ABC";
  4. this.quantity = 10;
  5. }
  6. buy(){
  7. console.log("Stock [ Name: " + this.name +
  8. ",Quantity: " + this.quantity +" ] bought");
  9. }
  10. sell(){
  11. console.log("Stock [ Name: " + this.name +
  12. ",Quantity: " + this.quantity +" ] sold");
  13. }
  14. }

那么我们可以先定义单一行为,比如买或卖,同时只有使用了execute才真正执行。

  1. class BuyStock {
  2. constructor(abcStock){
  3. this.abcStock = abcStock;
  4. }
  5. execute() {
  6. this.abcStock.buy();
  7. }
  8. }
  9. class SellStock{
  10. constructor(abcStock){
  11. this.abcStock = abcStock;
  12. }
  13. execute() {
  14. this.abcStock.sell();
  15. }
  16. }

那么我们可以使用一个列表orderList来接受挂单了,使用takeOrder提交挂单,同时到达交易时间,我们再使用placeOrders来进行交易处理。

  1. class Broker {
  2. constructor() {
  3. this.orderList = [];
  4. }
  5. takeOrder(order){
  6. this.orderList.push(order);
  7. }
  8. placeOrders(){
  9. for (const order of this.orderList) {
  10. order.execute();
  11. }
  12. this.orderList = [];
  13. }
  14. }

那么我们在使用的时候就更加直观和更加参数化了。

  1. const abcStock = new Stock();
  2. const buyStockOrder = new BuyStock(abcStock);
  3. const sellStockOrder = new SellStock(abcStock);
  4. const broker = new Broker();
  5. broker.takeOrder(buyStockOrder);
  6. broker.takeOrder(buyStockOrder);
  7. broker.takeOrder(buyStockOrder);
  8. broker.takeOrder(sellStockOrder);
  9. broker.takeOrder(sellStockOrder);
  10. broker.placeOrders();
  11. /**
  12. * output:
  13. * Stock [ Name: ABC,Quantity: 10 ] bought
  14. * Stock [ Name: ABC,Quantity: 10 ] bought
  15. * Stock [ Name: ABC,Quantity: 10 ] bought
  16. * Stock [ Name: ABC,Quantity: 10 ] sold
  17. * Stock [ Name: ABC,Quantity: 10 ] sold
  18. */

命令模式优势

由于命令模式是最终执行,所以中途可以发出很多不同的命令,能解决一些比如预约的问题。就比如上面的例子,股票可以提前下单,但是未必能最终生效。同时可以让代码展现更加直观和参数化。

上一页(责任链模式)

下一页(解释器模式)