@linux1s1s
2019-02-18T11:42:27.000000Z
字数 2767
阅读 1690
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;}@Overridepublic 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;}@Overridepublic 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!");}@Overridepublic 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();}}

