[关闭]
@linux1s1s 2019-02-18T19:42:27.000000Z 字数 2767 阅读 1373

Base Time-Design Patterns-Command

Base 2017-01


定义

将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化。用于“行为请求者”与“行为实现者”解耦,可实现二者之间的松耦合,以便适应变化。分离变化与不变的因素。

优点

1.降低对象之间的耦合度。
2.新的命令可以很容易地加入到系统中。
3.可以比较容易地设计一个组合命令。
4.调用同一方法实现不同的功能

缺点

使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用。

适用情况

1.系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。
2.系统需要在不同的时间指定请求、将请求排队和执行请求。
3.系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。
4.系统需要将一组操作组合在一起,即支持宏命令。

角色

UML

此处输入图片的描述

Code

  1. /**
  2. * @ClassName: Order
  3. * @Description: 执行命令的接口
  4. * @date 2017/1/12 20:34
  5. */
  6. public interface Order {
  7. void execute();
  8. }
  1. /**
  2. * @ClassName: BuyStock
  3. * @Description: Order实现类,操作卖股票 ConcreteCommand
  4. * @date 2017/1/12 20:35
  5. */
  6. public class BuyStock implements Order {
  7. private final Stock mStock;
  8. public BuyStock(Stock stock) {
  9. mStock = stock;
  10. }
  11. @Override
  12. public void execute() {
  13. mStock.buy();
  14. }
  15. }
  16. /**
  17. * @ClassName: SellStock
  18. * @Description: Order实现类,操作买股票 ConcreteCommand
  19. * @date 2017/1/12 20:41
  20. */
  21. public class SellStock implements Order {
  22. private final Stock mStock;
  23. public SellStock(Stock stock) {
  24. mStock = stock;
  25. }
  26. @Override
  27. public void execute() {
  28. mStock.sell();
  29. }
  30. }
  1. /**
  2. * @ClassName: Stock
  3. * @Description: 股票,命令接收者Receiver
  4. * @date 2017/1/12 20:36
  5. */
  6. public class Stock {
  7. private final String name;
  8. private final int quantity;
  9. public Stock(String name, int quantity) {
  10. this.name = name;
  11. this.quantity = quantity;
  12. }
  13. public void sell() {
  14. Log.w("command", this + " : Sell Now!");
  15. }
  16. public void buy() {
  17. Log.i("command", this + " : Buy Now!");
  18. }
  19. @Override
  20. public String toString() {
  21. return "Stock{" +
  22. "name='" + name + '\'' +
  23. ", quantity=" + quantity +
  24. '}';
  25. }
  26. }
  1. /**
  2. * @ClassName: Controller
  3. * @Description: 可以看做遥控器Invoker
  4. * @date 2017/1/12 20:42
  5. */
  6. public class Controller {
  7. private final List<Order> mOrders;
  8. public Controller() {
  9. mOrders = new ArrayList<>();
  10. }
  11. public boolean takeOrder(Order o) {
  12. if (o == null)
  13. return false;
  14. if (mOrders.contains(o))
  15. return true;
  16. mOrders.add(o);
  17. return true;
  18. }
  19. public void placeOrders() {
  20. for (Order o : mOrders) {
  21. o.execute();
  22. }
  23. mOrders.clear();
  24. }
  25. }
  1. /**
  2. * @ClassName: TestCase
  3. * @Description: 测试用例
  4. * @date 2017/1/12 20:30
  5. */
  6. public class TestCase {
  7. private TestCase() {
  8. //Do Nothing
  9. }
  10. public static void exe() {
  11. Controller c = new Controller();
  12. Stock s = new Stock("Google.HK", 5);
  13. Order oBuy = new BuyStock(s);
  14. Order oSell = new SellStock(s);
  15. c.takeOrder(oBuy);
  16. c.takeOrder(oSell);
  17. c.placeOrders();
  18. }
  19. }

验证结果

此处输入图片的描述

参考:
Design Patterns - Command Pattern
Java设计模式之命令模式

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注