Command - 命令模式

定义

将一个请求封装为一个对象,实现请求者与实施者的低耦合。

案例

大部分应用都存在非常多的菜单和一些操作button,但在设计这些菜单和button的时候,并不知道它要运行什么样的操作。在设计删除、复制和撤销这些详细实现的时候,也不知道在要什么地方用到,可能是代码里面直接调用,也可能是界面上点击了某个button后发生的操作。为了解决菜单和详细操作的这样的耦合度,就须要使用Command-命令模式:

菜单类的每个Item都保存一个Command子类的对象实例,当界面点击的时候,就调用Command的execute()方法,在Command子类的execute()方法里面会直接调用Receiver的action()方法,就运行详细的操作。

  1. class MenuItem {
  2. public:
  3. void setCommand(Command* comand) { m_command = command; }
  4. void onClicked() {
  5. m_command->execute();
  6. }
  7. private:
  8. Command* command;
  9. }
  10. class Command {
  11. public:
  12. virtual void execute();
  13. virtual bool isEnable();
  14. };
  15. class CopyCommand {
  16. public:
  17. virtual void execute() {
  18. m_receiver->action();
  19. }
  20. private:
  21. CopyReceiver* m_receiver;
  22. };
  23. class DeleteCommand {
  24. public:
  25. virtual void execute() {
  26. m_enable = m_receiver->action();
  27. }
  28. bool isEnable() {
  29. return m_enable;
  30. }
  31. private:
  32. DeleteReceiver* m_receiver;
  33. bool m_enable;
  34. };

一个Command对象还能够被不同的Invoker对象保存,用以实现相同的操作:

  1. MenuItem* copyItem = new MenuItem("Copy");
  2. MenuItem* deleteItem = new MenuItem("Delete");
  3. MenuItem* undoItem = new MenuItem("Undo");
  4. Button* copyButton = new Button("Copy");
  5. Button* deleteButton = new Button("Delete");
  6. Button* undoButton = new Button("Undo");
  7. Command* copyCommand = new CopyCommand();
  8. Command* deleteCommand = new DeleteCommand();
  9. Command* undoCommand = new UndoCommand();
  10. copyItem->setCommand(copyCommand);
  11. deleteItem->setCommand(deleteCommand);
  12. undoItem->setCommand(undoCommand);
  13. copyButton->setCommand(copyCommand);
  14. deleteButton->setCommand(deleteCommand);
  15. undoButton->setCommand(undoCommand);

同样的操作都使用同一个对象,当undoCommond的enable()返回false的时候,菜单和button都不能使用了。

适用性

  • 抽象出待运行的操作以參数化某对象,Command模式就像一个回调函数的对象实现。
  • 在不同的时刻指定、排列和运行请求,Commad有一个与初始请求无关的生存期。
  • 能够支持取消操作,在Command对象运行execute方法的之前把信息保存,提供一个unExecute方法恢复在运行前。也能够使用一个专门的Command来保存全部运行了的Commond对象比方UndoCommand来达到回滚操作。
  • 支持事物(Transaction),对一系列数据进行提交操作。
时间: 2024-10-25 07:50:13

Command - 命令模式的相关文章

设计模式14:Command 命令模式(行为型模式)

Command 命令模式(行为型模式) 耦合与变化 耦合是软件不能抵御变化的根本性原因.不仅实体对象与实体对象之间存在耦合关系,实体对象与行为操作之间也存在耦合关系. 动机(Motivation) 在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”.但在某些场合——比如对行为进行“记录.撤销/重做(undo/redo).事务”等处理,这种无法抵御变化的紧耦合是不合适的. 在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的解耦. 意

设计模式(十四):Command命令模式 -- 行为型模式

1.概述 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活. 例子1:电视机遥控器 : 遥控器是请求的发送者,电视机是请求的接收者,遥控器上有一些按钮如开,关,换频道等按钮就是具体命令,不同的按钮对应电视机的不同操作. 2.问题 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧

(15):(行为型模式) Command 命令模式

(15):(行为型模式) Command 命令模式

C++设计模式-Command命令模式

Command命令模式作用:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作. 由于“行为请求者”与“行为实现者”的紧耦合,使用命令模式,可以对请求排队或记录请求日志,以及支持可撤销的操作. UML图: Command类,用来声明执行操作的接口 ConcreteCommand,将一个接收者对象绑定于一个操作,调用接收者相应的操作,以实现Execute Invoker类,要求该命令执行这个请求 Receiver类,知道如何实施与执行一

command命令模式(行为模式)之我见

我觉得command命令模式的本质就是把触发者和接受者隔离开来,把一个函数能干的事情提升到类的级别 搞一个基类包含虚函数excute() 搞好多具体的接受者类C**command(),在具体接收类中去实现excute,和触发者invoke接触的是基类,利用多态性,真正干事儿的是具体的接受者类,这样隔离开来,无论加多少具体的接受者类 既有代码都不受影响 非常灵活 很多linux的软件既可以支持UI操作,也可以支持命令函操作.这时候就必须用command模式. command模式实际上把软件真正的业

Java设计模式(六) Command(命令模式)及Tomcat引申

基本概念 Command 命令模式是一个高内聚的模式(满足单一职责原则) 概念:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. 命令模式在项目中频繁使用,封装性和拓展性都有很好的保障 Command模式中的角色分工: Client:创建一个命令并决定接受者 Command:命令接口,定义一个抽象方法 Concrete Command:具体命令,负责调用接受者的相关操作 Invoker:请求者,负责调用命令对象执行请求 R

设计模式(14)--Command(命令模式)--行为型

作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义:   命令模式属于对象的行为模式.命令模式又称为行动(Action)模式或交易(Transaction)模式.   命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. 2.模式特点: 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序

[C++设计模式] command 命令模式

在软件系统中,"行为请求者"与"行为实现者"通常呈现一种"紧耦合".但在某些场合,比如要对行为进行"记录.撤销/重做.事务"等处理,这种无法抵御变化的紧耦合是不合适的.在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,实现二者之间的松耦合.这就是命令模式(Command Pattern). 在OOP中,一切都是对象,将请求封装成对象,符合OOP的设计思想,当将

GOF23设计模式之命令模式(Command)的理解与实现

 命令模式Command      命令模式:将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化:对请求排毒或者记录请求日志,以及支持可撤销的操作.也称之为:动作Action模式,事务Transaction模式   结构:      Command抽象命令类      ConcreteCommand具体命令类      Invoker调用者/请求者          请求的发送者,它通过命令对象来执行请求,一个调用者并不需要在设计时确定其接收者.因此它至于抽象命令类之间存在惯