命令模式(Command Pattern)是一種數(shù)據(jù)驅(qū)動(dòng)的設(shè)計(jì)模式,它屬于行為型模式。請(qǐng)求以命令的形式包裹在對(duì)象中,并傳給調(diào)用對(duì)象。調(diào)用對(duì)象尋找可以處理該命令的合適的對(duì)象,并把該命令傳給相應(yīng)的對(duì)象,該對(duì)象執(zhí)行命令。
關(guān)鍵代碼:定義三個(gè)角色:1、received 真正的命令執(zhí)行對(duì)象 2、Command 3、invoker 使用命令對(duì)象的入口
優(yōu)點(diǎn): 1、降低了系統(tǒng)耦合度。 2、新的命令可以很容易添加到系統(tǒng)中去。
缺點(diǎn):使用命令模式可能會(huì)導(dǎo)致某些系統(tǒng)有過(guò)多的具體命令類(lèi)。
- 創(chuàng)建一個(gè)命令接口。
/**
* 1. 創(chuàng)建一個(gè)命令接口。
* @author mazaiting
*/
public interface Order {
/**
* 執(zhí)行
*/
void execute();
}
- 創(chuàng)建一個(gè)請(qǐng)求類(lèi)。
/**
* 2. 創(chuàng)建一個(gè)請(qǐng)求類(lèi)。
* @author mazaiting
*/
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");
}
}
- 創(chuàng)建實(shí)現(xiàn)了 Order 接口的實(shí)體類(lèi)。
/**
* 3. 創(chuàng)建實(shí)現(xiàn)了 Order 接口的實(shí)體類(lèi)。
* @author mazaiting
*/
public class BuyStock implements Order{
private Stock abcStock;
public BuyStock(Stock abcStock){
this.abcStock = abcStock;
}
public void execute() {
abcStock.buy();
}
}
/**
* 3. 創(chuàng)建實(shí)現(xiàn)了 Order 接口的實(shí)體類(lèi)。
* @author mazaiting
*/
public class SellStock implements Order{
private Stock abcStock;
public SellStock(Stock abcStock){
this.abcStock = abcStock;
}
public void execute() {
abcStock.sell();
}
}
- 創(chuàng)建命令調(diào)用類(lèi)。
/**
* 4. 創(chuàng)建命令調(diào)用類(lèi)。
* @author mazaiting
*/
public class Broker {
private List<Order> orderList = new ArrayList<Order>();
/**
* 添加命令
*/
public void takeOrder(Order order) {
orderList.add(order);
}
/**
* 執(zhí)行并清空命令
*/
public void placeOrders(){
for (Order order : orderList) {
order.execute();
}
orderList.clear();
}
}
- 使用 Broker 類(lèi)來(lái)接受并執(zhí)行命令。
/**
* 5. 使用 Broker 類(lèi)來(lái)接受并執(zhí)行命令。
* @author mazaiting
*/
public class Client {
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();
}
}
- 打印結(jié)果
Stock [ Name: ABC, Quantity: 10 ] bought
Stock [ Name: ABC, Quantity: 10 ] sold