命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找能够处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。设计模式
介绍
意图:将一个请求封装成一个对象,从而使您能够用不一样的请求对客户进行参数化。spa
主要解决:在软件系统中,行为请求者与行为实现者一般是一种紧耦合的关系,但某些场合,好比须要对行为进行记录、撤销或重作、事务等处理时,这种没法抵御变化的紧耦合的设计就不太合适。设计
什么时候使用:在某些场合,好比要对行为进行"记录、撤销/重作、事务"等处理,这种没法抵御变化的紧耦合是不合适的。在这种状况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,能够实现两者之间的松耦合。3d
如何解决:经过调用者调用接受者执行命令,顺序:调用者→接受者→命令。对象
关键代码:定义三个角色:一、received 真正的命令执行对象 二、Command 三、invoker 使用命令对象的入口blog
应用实例:struts 1 中的 action 核心控制器 ActionServlet 只有一个,至关于 Invoker,而模型层的类会随着不一样的应用有不一样的模型类,至关于具体的 Command。接口
优势: 一、下降了系统耦合度。 二、新的命令能够很容易添加到系统中去。事务
缺点:使用命令模式可能会致使某些系统有过多的具体命令类。it
使用场景:认为是命令的地方均可以使用命令模式,好比: 一、GUI 中每个按钮都是一条命令。 二、模拟 CMD。io
注意事项:系统须要支持命令的撤销(Undo)操做和恢复(Redo)操做,也能够考虑使用命令模式,见命令模式的扩展。
实现
咱们首先建立做为命令的接口 Order,而后建立做为请求的 Stock 类。实体命令类 BuyStock 和 SellStock,实现了 Order 接口,将执行实际的命令处理。建立做为调用对象的类 Broker,它接受订单并能下订单。
Broker 对象使用命令模式,基于命令的类型肯定哪一个对象执行哪一个命令。CommandPatternDemo,咱们的演示类使用 Broker 类来演示命令模式。