原文:http://www.runoob.com/design-pattern/
少许个人理解,如有错误请指出。欢迎一起讨论。

命令模式(Command Pattern)
是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。

意图:
将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。

主要解决:
在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。

何时使用:
在某些场合,比如要对行为进行”记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将”行为请求者”与”行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。

如何解决:
通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。

关键代码:
定义三个角色:
1、received 真正的命令执行对象
2、Command
3、invoker 使用命令对象的入口

应用实例:
struts 1 中的 action 核心控制器 ActionServlet 只有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的 Command。

优点:
1、降低了系统耦合度。
2、新的命令可以很容易添加到系统中去。

缺点:
使用命令模式可能会导致某些系统有过多的具体命令类。

使用场景:
认为是命令的地方都可以使用命令模式,比如:
1、GUI 中每一个按钮都是一条命令。
2、模拟 CMD。

注意事项:
系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。

代码实现
我们首先创建作为命令的接口 Order,然后创建作为请求的 Stock 类。实体命令类 BuyStock 和 SellStock,实现了 Order 接口,将执行实际的命令处理。创建作为调用对象的类 Broker,它接受订单并能下订单。
Broker 对象使用命令模式,基于命令的类型确定哪个对象执行哪个命令。CommandPatternDemo,我们的演示类使用 Broker 类来演示命令模式。

命令模式的 UML 图

步骤 1
创建一个命令接口。
Order.java

public interface Order {void execute();
}

步骤 2
创建一个请求类。
Stock.java

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");}
}

步骤 3
创建实现了 Order 接口的实体类。
BuyStock.java

public class BuyStock implements Order {private Stock abcStock;public BuyStock(Stock abcStock){this.abcStock = abcStock;}public void execute() {abcStock.buy();}
}

SellStock.java

public class SellStock implements Order {private Stock abcStock;public SellStock(Stock abcStock){this.abcStock = abcStock;}public void execute() {abcStock.sell();}
}

步骤 4
创建命令调用类。
Broker.java

import java.util.ArrayList;
import java.util.List;public class Broker {private List<Order> orderList = new ArrayList<Order>(); public void takeOrder(Order order){orderList.add(order);     }public void placeOrders(){for (Order order : orderList) {order.execute();}orderList.clear();}
}

步骤 5
使用 Broker 类来接受并执行命令。
CommandPatternDemo.java

public class CommandPatternDemo {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();}
}

步骤 6
验证输出。

Stock [ Name: ABC, Quantity: 10 ] bought
Stock [ Name: ABC, Quantity: 10 ] sold

另一篇关于命令模式的好文:
http://blog.csdn.net/jason0539/article/details/45110355

设计模式笔记十五:命令模式相关推荐

  1. C#设计模式之十五迭代器模式(Iterator Pattern)【行为型】

    一.引言 今天我们开始讲"行为型"设计模式的第三个模式,该模式是[迭代器模式],英文名称是:Iterator Pattern.还是老套路,先从名字上来看看."迭代器模式& ...

  2. 设计模式学习笔记十五——Command模式

    动机:将一组行为抽象为对象,实现行为请求者和行为实现者之间的解耦,并且支持对行为进行记录.撤销.重做.事务等处理. 场景:考虑一系列文档操作:打开.复制.剪切.粘帖. 结构 代码实现 /**//*   ...

  3. 从王者荣耀看设计模式(十五.建造者模式)

    从王者荣耀看设计模式(建造者模式) 一.简介 为了玩王者荣耀的游戏体验感,不少玩家都会选择花钱购买自己常用英雄的皮肤.一方面,购买的皮肤通常要比原画更加"炫酷".另一方面,购买的英 ...

  4. 享元模式 FlyWeight 结构型 设计模式(十五)

    享元模式(FlyWeight)  "享"取"共享"之意,"元"取"单元"之意. 意图 运用共享技术,有效的支持大量细粒度 ...

  5. 云计算设计模式(十五)——管道和过滤器模式

    云计算设计模式(十五)--管道和过滤器模式 分解,执行复杂处理成一系列可重复使用分立元件的一个任务.这种模式可以允许执行的处理进行部署和独立缩放任务元素提高性能,可扩展性和可重用性. 背景和问题 一个 ...

  6. 设计模式自学笔记007_Real(命令模式、备忘录模式、桥接模式)

    设计模式自学笔记007_Real(命令模式.备忘录模式.桥接模式) 一.命令模式 在软件设计的过程中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道请求的操作是哪个.我们只需要 ...

  7. windows内核开发学习笔记十五:IRP结构

    windows内核开发学习笔记十五:IRP结构   IRP(I/O Request Package)在windows内核中,有一种系统组件--IRP,即输入输出请求包.当上层应用程序需要访问底层输入输 ...

  8. Polyworks脚本开发学习笔记(十五)-用Python连接Polyworks的COM组件

    Polyworks脚本开发学习笔记(十五)-用Python连接Polyworks的COM组件 用Polyworks脚本开发,没有高级语言的支持,功能难免单一,一些比较复杂的交互实现不了,界面和报告也很 ...

  9. 云计算设计模式(十)——守门员模式

    云计算设计模式(十)--守门员模式 通过使用充当客户端和应用程序或服务之间的代理,验证和进行消毒的请求,并将它们之间的请求和数据的专用主机实例保护的应用程序和服务.这可以提供一个额外的安全层,并限制了 ...

最新文章

  1. python arcade库是干什么的-Python街机模块arcade的鼠标移动与单击示例
  2. 编码 data:text/html;c,iOS 用TFHpple抓取GB-2312编码的html页面,页面返回编码错误
  3. Leetcode题库 6.Z字形变换(C实现)
  4. 一文读懂哈希和一致性哈希算法
  5. python为什么这么小_同样是 Python,怎么区别这么大
  6. Java 最常见 200+ 面试题全解析:面试必备
  7. c#ovalshape_How to: Draw Shapes with the OvalShape and RectangleShape Controls (Visual Studio)
  8. C++11的POD类型
  9. linux文件的基本权限、默认权限、特殊权限总结
  10. Microsoft Visio2003 简体中文版 下载
  11. PDMS二次开发(五)——小试牛刀之细节整理和收尾
  12. 地形剖面matlab,基于MATLAB河道横断面绘制.doc
  13. 12款好用超赞的国外搜索资源网站 ,开发者们的标配,你都知道吗?不知道就OUT了...
  14. 计算机组成原理期中考,计算机组成原理期中考卷
  15. android系统蓝牙音箱功能吗,Android蓝牙开发系列文章-其实你的手机可以变成一个蓝牙音箱...
  16. Holt-Winters 季节方法
  17. CCS6.1最后安装出现报错如下
  18. Python爬取王者荣耀官网图片
  19. c#基本学习,啃书版本重难点。
  20. JS设置select标签选中的值

热门文章

  1. 2021的行情下如何能够赚到自己认知范围内的钱?一些投资需要补充的内容
  2. 硬件创新需要去理解的点(精炼总结)
  3. 使用jsp实现文件上传的功能
  4. java控制台输出等腰三角形,并且是倒序正序输出【原创】
  5. 支付宝及时到账(新版)配置
  6. animate.css官网
  7. Hadoop源码分析21:namenode概要
  8. 转走出MFC窗口子类化迷宫
  9. 关于android 双击事件
  10. 给一个aspx页面上所有的TextBox置值