命令模式是一个数据驱动设计模式,它归属于行为型模式的范畴。一个请求作为命令的形式被封装成一个对象,并且传递给调用对象。调用对象查找能够处理这个命令的恰当对象,传递命令给相应的对象,那个对象就执行这个命令。
在这个实例中,我们创建了一个充当一个命令的接口Order,创建一个股票类Stock充当一个请求。具体的命令类BuyStock和SellStock实现Order接口,它们将做实际上的命令处理。经纪人类Broker充当一个调用对象,它负责收集和发送命令。UML图如下所示:
接口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"); } }
实现订单接口的实现类,购买股票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(); } } 测试类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
你会发现,这里面包含了组合模式。