十五、命令模式
命令模式(Command Pattern)是一种数据驱动型的设计模式,请求以命令的形式包裹在对象之中。
调用对象寻找可以处理该命令的合适对象,并交由它执行。
简介
命令模式,主要将请求封装为对象,从而可以用不同的请求来对客户端参数化处理。
- 优点:降低系统耦合度、易于扩展。
- 缺点:使用命令模式可能会导致系统有过多的命令类。
实现
创建一个命令接口IOrder
,然后创建它的两个具体命令实现类,并创建一个请求封装类,包含了不同请求方法。
然后创建一个命令请求类,来对外提供调用命令的接口。
- 创建接口
IOrder.java
/**
* Created by lenovo on 2016/11/30 0030.
* 命令接口
*/
public interface IOrder {
void execute();
}
- 实现类
BuyStock.java
/**
* Created by lenovo on 2016/11/30 0030.
* Order的接口实现类,具体化的操作指令
*/
public class BuyStock implements IOrder {
private Stock abcStock;//请求
public BuyStock(Stock stock) {
this.abcStock = stock;
}
//通过持有的stock对象,调用相应的方法
@Override
public void execute() {
abcStock.buy();
}
}
SellStock.java
/**
* Created by lenovo on 2016/11/30 0030.
* IOrder的实现类,卖东西的具体实现
*/
public class SellStock implements IOrder{
private Stock abcStock;
public SellStock(Stock stock){
this.abcStock = stock;
}
@Override
public void execute() {
abcStock.sell();
}
}
- 创建请求类
Stock.java
/**
* Created by lenovo on 2016/11/30 0030.
* 请求类,发送一些请求指令。
*/
public class Stock {
private String name = "ABC";
private int quantity = 10;
public void buy(){
System.out.printf("请求,name = %s Quantity = %s 买东西",name,quantity);
System.out.println();
}
public void sell(){
System.out.printf("请求,name = %s Quantity = %s 卖东西",name,quantity);
System.out.println();
}
}
- 调用类
Broker.java
import java.util.ArrayList;
import java.util.List;
/**
* Created by lenovo on 2016/11/30 0030.
* 命令的调用者
*/
public class Broker {
private List<IOrder> orders = new ArrayList<>();
public void takeOrder(IOrder order) {
orders.add(order);
}
//执行指令
public void placeOrders() {
for (IOrder order : orders) {
order.execute();
}
orders.clear();
}
}
- 演示
CommandPatternDemo.java
/**
* Created by lenovo on 2016/11/30 0030.
* 演示,
*/
public class CommandPatternDemo {
public static void main(String[] args) {
Stock abcStock = new Stock();
BuyStock buyStock = new BuyStock(abcStock);
SellStock sellStock = new SellStock(abcStock);
Broker broker = new Broker();
broker.takeOrder(buyStock);
broker.takeOrder(sellStock);
broker.placeOrders();
}
}
- 输出
请求,name = ABC Quantity = 10 买东西
请求,name = ABC Quantity = 10 卖东西