命令模式是数据驱动设计模式,属于行为模式类别。 请求作为命令包装在一个对象下,并传递给调用器对象。 调用者对象查找可以处理此命令的适当对象,并将命令传递到执行命令的相应对象。
实现实例
在这个示例中,创建了一个作为命令的接口- Order,同时也创建了一个Stock类作为请求。 有具体的命令类BuyStock和SellStock实现Order接口将做实际的命令处理。 将创建一个类Broker作为调用器对象。它可以接收和下订单。
Broker对象使用命令模式来标识哪个对象,并根据命令类型执行哪个命令。 CommandPatternDemo这是一个演示入口类,将使用Broker类演示命令模式。
命令模式的实现实例结构如下图中所示 -
第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步
创建实现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();}}
第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