开发手册 欢迎您!
软件开发者资料库

设计模式 - 命令模式

设计模式命令模式 - 通过简单易用的步骤学习Java设计模式:初学者教程,包含从工厂模式,抽象工厂,单例,构建器,原型,适配器,桥,过滤器,复合,装饰器开始的Java设计模式的完整知识外立面,Flyweight,代理,命令,口译员,迭代器,调解员,纪念品,观察员,状态,空对象,战略,模板,访客,MVC,前端控制器等。

命令模式是一种数据驱动的设计模式,属于行为模式类别.请求作为命令包装在对象下并传递给调用者对象. Invoker对象查找可以处理此命令的相应对象,并将该命令传递给执行该命令的相应对象.

实现

我们已创建一个接口 Order ,它充当一个命令.我们创建了一个 Stock 类作为请求.我们有具体的命令类 BuyStock SellStock 实现 Order 界面,它将进行实际的命令处理.创建一个类 Broker ,它充当调用者对象.它可以接受和下订单.

Broker 对象使用命令模式来识别哪个对象将根据命令类型执行哪个命令.我们的演示类 CommandPatternDemo 将使用 Broker 类来演示命令模式.

命令模式UML图

步骤1

创建命令界面.

Order.java

 public interface Order { void execute(); }

第2步

创建请求类.

Stock.java

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");   } }

步骤3

创建实现订单的具体类界面.

BuyStock.java

public class BuyStock implements Order {   private Stock abcStock;   public BuyStock(Stock abcStock){      this.abcStock = abcStock;   }   public void execute() {      abcStock.buy();   } }

SellStock.java

public class SellStock implements Order {   private Stock abcStock;   public SellStock(Stock abcStock){      this.abcStock = abcStock;   }   public void execute() {      abcStock.sell();   } }

步骤4

创建命令调用程序类.

Broker.java

import java.util.ArrayList;import java.util.List;   public class Broker {   private List orderList = new ArrayList();    public void takeOrder(Order order){      orderList.add(order);   }   public void placeOrders(){         for (Order order : orderList) {         order.execute();      }      orderList.clear();   } }

步骤5

使用Broker类来获取和执行命令.

CommandPatternDemo.java

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();   } }

步骤6

验证输出.

Stock [ Name: ABC, Quantity: 10 ] boughtStock [ Name: ABC, Quantity: 10 ] sold