定义:通过将一系列的操作封装成一个命令对象,方便执行,同时也能够更好的让我们进行一些操作回滚,用来记录是否执行过该操作等问题。
场景:
1、当一个应用程序调用者与多个目标对象之间存在调用关系时,并且目标对象之间的操作很类似的时候。
2、例如当一个目标对象内部的方法调用太复杂,或者内部的方法需要协作才能完成对象的某个特点操作时。
3、有时候调用者调用目标对象后,需要回调一些方法。
角色:
1.Invoke:调用者对象。
Receiver:接收调用者请求执行操作的目标对象。
ICommand:用于解耦目标对象与调用者之间的抽象命令对象。
使用:首先创建作为命令的接口 Order,然后创建作为请求的 Stock 类(命令对象)。实体命令类(对应一些列操作) BuyStock 和 SellStock,实现了 Order 接口,将执行实际的命令处理。创建作为调用对象的类 Broker,它接受订单并能下订单。
1.创建一个命令接口及命令接口的实体类。
public interface Order { void execute(); } public class BuyStock implements Order { private Stock abcStock; public BuyStock(Stock abcStock){ this.abcStock = abcStock; } public void execute() { abcStock.buy(); } } public class SellStock implements Order { private Stock abcStock; public SellStock(Stock abcStock){ this.abcStock = abcStock; } public void execute() { abcStock.sell(); } }
2.创建一个请求类。
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.创建命令调用类
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(); } }