15 行为型模式-----命令模式

模式动机(Command Pattern)将请求封装为对象,从而可以用不同的请求对客户进行参数化;对请求进行排队或记录请求日志;设计可撤销的结构等,这些都是命令模式发挥作用的环境。核心思想是:定义一个抽象的Command接口以执行命令。具体如何执行需要其子类ConcreteCommand来实现。ConcreteCommand在执行命令时必须借助于合适的接受该命令的对象,因此其维护一个Receiver指针。这样就能将命令调用者Invoker和命令的实际接收者Receiver进行解耦,调用者针对抽象Command进行编程,而只有具体Command才与接收者Receiver进行通信。

模式结构图:

模式代码:

bt_命令模式.h:

 1 #ifndef CP_H
 2 #define CP_H
 3 #include <iostream>
 4 using namespace std;
 5
 6 /*
 7     抽象命令接口
 8 */
 9 class Command
10 {
11 public:
12     virtual ~Command(){ };
13     virtual void Execute() = 0;
14 };
15
16 /*
17     具体命令类
18 */
19 class Receiver;
20 class ConcreteCommand : public Command
21 {
22 public:
23     ConcreteCommand(Receiver* rev) : receiver(rev){ }
24     virtual void Execute();
25 private:
26     Receiver* receiver;
27 };
28
29 /*
30     接收者
31 */
32 class Receiver
33 {
34 public:
35     void Action()
36     {
37         cout << "接收者执行命令..." << endl;
38     }
39 };
40
41 void ConcreteCommand::Execute()
42 {
43     cout << "启动命令接收者..." << endl;
44     receiver->Action();
45 }
46
47 /*
48     调用命令者
49 */
50 class Invoker
51 {
52 public:
53     Invoker(Command* cmd) : command(cmd){ }
54     void Invoke()
55     {
56         cout << "发出命令..." << endl;
57         command->Execute();              // 发出执行命令请求
58     }
59
60 private:
61     Command* command;
62 };
63
64 #endif // CP_H

测试用例.cpp:

 1 #include "bt_命令模式.h"
 2
 3 int main()
 4 {
 5     cout << "***** 命令模式测试 *****" << endl;
 6
 7     Receiver* rev = new Receiver;
 8     Command* cmd = new ConcreteCommand(rev);
 9     Invoker* ivk = new Invoker(cmd);
10
11     ivk->Invoke();
12
13     delete ivk;
14     delete cmd;
15     delete rev;
16
17     return 0;
18 }


模式分析:

|| 命令模式使得命令的发送者和接收者进行了很好的解耦,因此,新的命令方式可以很容地加入到系统中。结合组合模式可以实现一组命令的执行,相当于具有宏的作用;结合备忘录模式可以实现Undo和Redo操作。

|| 如果一个命令不需要执行Undo操作,也不需要传入参数,那么可以使用模板来实现,这样就避免了为每一个具体命令都创建一个Command子类。

|| 命令模式设计过程中,各个类的协作过程如下:

::Client创建一个具体的ConcreteCommand对象,同时指出其接收者Receiver对象;

::Invoker对象调用Command的Execute操作提交请求命令,若该命令支持Undo操作,那么Concrete在具体执行Execute之前就会存储当前状态以便于撤销该命令时恢复环境;

::ConcreteCommand调用Receiver对象来处理该命令。

时间: 2024-09-30 12:25:03

15 行为型模式-----命令模式的相关文章

java设计模式--行为型模式--命令模式

1 命令模式 2 概述 3 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤消的操作. 4 5 6 适用性 7 1.抽象出待执行的动作以参数化某对象. 8 9 2.在不同的时刻指定.排列和执行请求. 10 11 3.支持取消操作. 12 13 4.支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍. 14 15 5.用构建在原语操作上的高层操作构造一个系统. 16 17 18 参与者 19 1.Command 20 声明执行操作的接口.

行为型模型 命令模式

行为型模型 命令模式 Command         Command命令的抽象类. ConcreteCommand         Command的具体实现类. Receiver         需要被调用的目标对象. Invorker         通过Invorker执行Command对象. 适用于:         是将一个请求封装为一个对象,从而使你可用不同的请求对客户端进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作. /** * 行为型模型 命令模式 * Command模

Java设计模式(九)责任链模式 命令模式

(十七)责任链模式 责任链模式的目的是通过给予多个对象处理请求的机会,已解除请求发送者与接受者之间的耦合关系.面对对象的开发力求对象之前保持松散耦合,确保对象各自的责任最小化,这样的设计可以使得系统更加容易修改,同时降低产生缺陷的风险. public class ChainTest { public static void main(String[] args) { String pass1="123456"; String pass2="123456"; Stri

第16章 行为型模式—命令模式

1. 命令模式(Command Pattern)的定义 (1)定义 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作. ①封装请求:抽象出需要执行的动作,封装成对象(有统一的接口). ②参数化:可以用不同的命令对象,去参数化配置客户的请求.(即,将命令对象作为参数去供Invoker调用). (2)命令模式的结构和说明 ①Command:定义命令的接口,声明执行的方法 ②ConcreteCommand:命令接口实现对象,是“虚”的实现

设计模式--行为型模式--命令模式

=========================命令模式:========================= 废话不说了,先看例子: 模拟对电视机的操作有开机.关机.换台命令.代码如下 Command角色--定义命令的接口,声明执行的方法. 1 //执行命令的接口 2 public interface Command { 3 void execute(); 4 } Receive角色--命令接收者,真正执行命令的对象.实现命令要求实现的相应功能. 1 //命令接收者Receiver 2 pub

设计模式(行为型)之命令模式(Command Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之策略模式(Strategy Pattern)>http://blog.csdn.net/yanbober/article/details/45498567 概述 在软件开发中,我们经常需要向某些对象发送请求(调用其中的某个或某些方法),但是并不知道请求的接收

4周第3次课 vim 进入编辑模式 命令模式

进入编辑模式 即进入可以对文档进行编辑的模式 按键 作用 i 在当前字符插入 I 在光标所在行的行首插入 a 在当前字符后插入 A 在光标所在行的行尾插入 o 在光标所在行的下方插入一行 O 在光标所在行的上方插入一行 vim命令模式 命令 作用 /word 向光标之后查找一个字符串word,按 n 向后继续搜索,N向前返回搜索 ?word 向光标之前查找一个字符串word,按 n 向前继续搜索 :n1,n2s/word1/word2/g 在n1-n2行范围之间查找word1并替换为word2,

设计模式之命令模式学习理解

命令模式 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式.请求以命令的形式包裹在对象中,并传给调用对象.调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令. 介绍 意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化. 主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录.撤销或重做.事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适. 何时使用:在某些

设计模式-行为型模式-策略模式

策略模式 在实际工作中我用到了策略模式,但为什么要有环境角色呢? 这里我贴上英文对含义的介绍, The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it. 然后看看这种设计模式的组成, 一般的,策略模式