@linux1s1s
2019-02-18T19:42:27.000000Z
字数 2767
阅读 1395
Base
2017-01
将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化。用于“行为请求者”与“行为实现者”解耦,可实现二者之间的松耦合,以便适应变化。分离变化与不变的因素。
1.降低对象之间的耦合度。
2.新的命令可以很容易地加入到系统中。
3.可以比较容易地设计一个组合命令。
4.调用同一方法实现不同的功能
使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用。
1.系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。
2.系统需要在不同的时间指定请求、将请求排队和执行请求。
3.系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。
4.系统需要将一组操作组合在一起,即支持宏命令。
/**
* @ClassName: Order
* @Description: 执行命令的接口
* @date 2017/1/12 20:34
*/
public interface Order {
void execute();
}
/**
* @ClassName: BuyStock
* @Description: Order实现类,操作卖股票 ConcreteCommand
* @date 2017/1/12 20:35
*/
public class BuyStock implements Order {
private final Stock mStock;
public BuyStock(Stock stock) {
mStock = stock;
}
@Override
public void execute() {
mStock.buy();
}
}
/**
* @ClassName: SellStock
* @Description: Order实现类,操作买股票 ConcreteCommand
* @date 2017/1/12 20:41
*/
public class SellStock implements Order {
private final Stock mStock;
public SellStock(Stock stock) {
mStock = stock;
}
@Override
public void execute() {
mStock.sell();
}
}
/**
* @ClassName: Stock
* @Description: 股票,命令接收者Receiver
* @date 2017/1/12 20:36
*/
public class Stock {
private final String name;
private final int quantity;
public Stock(String name, int quantity) {
this.name = name;
this.quantity = quantity;
}
public void sell() {
Log.w("command", this + " : Sell Now!");
}
public void buy() {
Log.i("command", this + " : Buy Now!");
}
@Override
public String toString() {
return "Stock{" +
"name='" + name + '\'' +
", quantity=" + quantity +
'}';
}
}
/**
* @ClassName: Controller
* @Description: 可以看做遥控器Invoker
* @date 2017/1/12 20:42
*/
public class Controller {
private final List<Order> mOrders;
public Controller() {
mOrders = new ArrayList<>();
}
public boolean takeOrder(Order o) {
if (o == null)
return false;
if (mOrders.contains(o))
return true;
mOrders.add(o);
return true;
}
public void placeOrders() {
for (Order o : mOrders) {
o.execute();
}
mOrders.clear();
}
}
/**
* @ClassName: TestCase
* @Description: 测试用例
* @date 2017/1/12 20:30
*/
public class TestCase {
private TestCase() {
//Do Nothing
}
public static void exe() {
Controller c = new Controller();
Stock s = new Stock("Google.HK", 5);
Order oBuy = new BuyStock(s);
Order oSell = new SellStock(s);
c.takeOrder(oBuy);
c.takeOrder(oSell);
c.placeOrders();
}
}