设计模式之命令模式

定义:通过将一系列的操作封装成一个命令对象,方便执行,同时也能够更好的让我们进行一些操作回滚,用来记录是否执行过该操作等问题。
场景:
1、当一个应用程序调用者与多个目标对象之间存在调用关系时,并且目标对象之间的操作很类似的时候。
2、例如当一个目标对象内部的方法调用太复杂,或者内部的方法需要协作才能完成对象的某个特点操作时。
3、有时候调用者调用目标对象后,需要回调一些方法。
角色:
1.Invoke:调用者对象。
Receiver:接收调用者请求执行操作的目标对象。
ICommand:用于解耦目标对象与调用者之间的抽象命令对象。

使用:首先创建作为命令的接口 Order,然后创建作为请求的 Stock 类(命令对象)。实体命令类(对应一些列操作) BuyStock 和 SellStock,实现了 Order 接口,将执行实际的命令处理。创建作为调用对象的类 Broker,它接受订单并能下订单。
1.创建一个命令接口及命令接口的实体类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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.创建一个请求类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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.创建命令调用类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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();
}
}