命令模式是数据驱动设计模式,属于行为模式类别。 请求作为命令包装在一个对象下,并传递给调用器对象。 调用者对象查找可以处理此命令的适当对象,并将命令传递到执行命令的相应对象。
在这个示例中,创建了一个作为命令的接口- Order
,同时也创建了一个Stock
类作为请求。 有具体的命令类BuyStock
和SellStock
实现Order
接口将做实际的命令处理。 将创建一个类Broker
作为调用器对象。它可以接收和下订单。
Broker
对象使用命令模式来标识哪个对象,并根据命令类型执行哪个命令。 CommandPatternDemo
这是一个演示入口类,将使用Broker
类演示命令模式。
命令模式的实现实例结构如下图中所示 -
创建一个命令接口。实现代码如下所示 -
Order.java
public interface Order { void execute(); }
创建一个请求对象
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"); } }
创建实现Order
接口的具体类。
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(); } }
创建命令调用程序类。
Broker.java
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(); } }
使用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(); } }
验证输出,执行上面的代码得到以下结果 -
Stock [ Name: ABC, Quantity: 10 ] bought Stock [ Name: ABC, Quantity: 10 ] sold