//---------------------------15/04/25----------------------------

//Conmmand  命令模式----对象行为型模式

/*

1:意图:

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,

以及支持可撤销的操作。

2:别名:

Action,Transaction(事务)

3:动机:

4:适用性:

1>抽象出待执行的动作以参数化某对象。可以使用回调函数表达这种参数化机制。

也就是说,Conmmand模式是回调机制的一个面向对象的代替品。

2>在不同的时刻指定、排列和执行请求。一个Conmmand对象可以有一个与初始请求无关的生存期。

如果请求的接收者可以用一种与地址空间无关的方式表达,那么就可以将负责该请求的命令对象

传送给另一个不同的进程,并在那儿实现该请求。

3>支持取消操作。执行操作后,可以调用一个接口来取消操作。

4>支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍。

5>用构建在原语操作上的高层操作构造一个系统。

5:结构:

Client               Invoker------->Command:

|  |                               Execute()

|                                   |

|  |                               ConcreteCommand:

|------->Receiver:<-------------receiver

|           Action()               Execute()

{ receiver->Action();}

|- - - - - - - - - - - - - - - - ->state

6:参与者:

1>Command:

声明执行操作的接口。

2>ConcreteCommand

1)将一个接收者对象绑定于一个动作。

2)调用接收者相应的操作,以实现Execute。

3>Client

创建一个具体命令对象并设定它的接受者。

4>Invoker

要求该命令执行这个请求。

5>Receiver

知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接受者。

7:协作:

1>Client创建一个ConcreteCommand对象并指定它的Receiver对象。

2>某Invoker对象存储该ConcreteCommand对象。

3>该Invoker通过调用Conmmand对象的Execute操作来提交一个请求。若该命令时可撤销的,

ConcreteCommand就在执行Execute操作之前存储当前状态以用于取消该命令。

4>ConcreteCommand对象调用它的Receiver的一些操作以执行该请求。

8:效果:

1>Command模式将调用操作的对象与指导如何实现该操作的对象解耦。

2>Command是头等的对象。它们可以像其他的对象一样被操作和扩展。

3>你可讲多个命令装配成一个复合命令。

4>增加新的Command很容易,因为这无需改变已有的类。

9:实现:

1>一个命令对象应达到何种智能程度:

命令对象的能力可大可小。一个极端是只确定接收者和执行该请求的动作。另一个极端是自己

实现所有功能,根本不需要额外的接收者对象。(这样就退化成策略模式了)

2>支持取消和重做

如果Command提供方法逆转他们操作的执行(例如Unexecute或Undo操作),就可以支持取消和重做

功能。为了达到这个目的ConcreteCommand类需要存储额外的状态信息:

1)接收者对象,它真正执行处理该请求的各操作。

2)接收者执行操作的参数。

3)如果处理请求的操作会改变接收者对象中的某些值,那么这些值夜必须先存储起来。接收者

还必须提供一些操作,以使该命令可将接收者恢复到它先前的状态。

3>避免取消操作过程中的错误积累

使用Menmento模式来让Command访问信息时不暴露其他对象的内部信息。

4>使用C++模版


不能取消 并且
不需要参数的命令,可以使用C++模版实现,这样可以避免为每一种动作和接收者

都创建一个Command子类。

10:代码示例:                                                                        */

//abstract Command类

class Command

{

public:

virtual ~Command();

virtual void Execute() =
;

protected:

Command();

};

//ConcreteCommand:

class OpenCommand :
public Command

{

public:

OpenCommand(Application*);

virtual void Execute();

protected:

virtual const
char* AskUser();

private:

Application* _application;

char* _response;

};

OpenCommand::OpenCommand(Application* a)

{

_application = a;

}

//先请求一个名字,然后添加文件,然后打开之

void OpenCommand::Execute()

{

const char* name = AskUser();

)

{

Document* document =
new Document(name);

_application->Add(document);

document->Open();

}

}

//ConcreteCommand:

class PasteCommand :
public Command

{

public:

PasteCommand(Document*);

virtual void Execute();

private:

Document* _document;

};

PasteCommand::PasteCommand(Document* doc)

{

_document = doc;

}

void PasteCommand::Execute()

{

_document->Paste();

}

//ConcreteCommand:通过模版实现,避免多余的子类。

template<class Receiver>

class SimpleCommand :
public Command

{

public:

//创建一个别名:这是一个函数指针,一个参数为空,返回为空的Receiver类的成员函数指针

//也是因为这个命令不需要参数,所以可以声明成模版类。

typedef void (Receiver::* Action)();

SimpleCommand(Receiver* r, Action a): _receiver(r), _action(a){}

virtual void Execute();

private:

Action _action;

Receiver* _receiver;

};

template<class Receiver>

void SimpleCommand<Receiver>::Execute()

{

(_receiver->*_action)();

}

MyClass* Receiver =
new MyClass;

//...

Command* aCommand =
new SimpleCommand<MyClass>(receiver, &MyClass::Action);

//...

aCommand->Execute();

//ConcreteCommand:一次执行多条命令的复合命令

class MarroCommand :
public Command

{

public:

MarroCommand();

virtual ~MarroCommand();

virtual void Add(Command*);

virtual void Remove(Command*);

virtual void Execute();

private:

List<Command*>* _cmds;

};

void MarroCommand::Execute()

{

ListIterator<Command*> i(_cmds);

for(i.First(); !i.IsDone(); i.Next())

{

Command* c = i.CurrentItem();

c->Execute();

}

}

void MarroCommand::Add(Command* c)

{

_cmds->Append(c);

}

void MarroCommand::Remove(Command* c)

{

_cmds->Remove(c);

}

设计模式 笔记 命令模式 Command的更多相关文章

  1. 设计模式 ( 十三 ) 命令模式Command(对象行为型)

    设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述         在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需 ...

  2. 乐在其中设计模式(C#) - 命令模式(Command Pattern)

    原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...

  3. 面向对象设计模式_命令模式(Command)解读

    在.Net框架中很多对象的方法中都会有Invoke方法,这种方法的设计实际是用了设计模式的命令模式, 模式图如下 其核心思路是将Client 向Receiver发送的命令行为进行抽象(ICommand ...

  4. 二十四种设计模式:命令模式(Command Pattern)

    命令模式(Command Pattern) 介绍将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可取消的操作. 示例有一个Message实体类,某个 ...

  5. 设计模式-15命令模式(Command Pattern)

    1.模式动机 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使 ...

  6. [设计模式] 14 命令模式 Command

    Command 模式通过将请求封装到一个对象(Command)中,并将请求的接受者存放到具体的 ConcreteCommand 类中(Receiver)中,从而实现调用操作的对象和操作的具体实现者之间 ...

  7. 设计模式之命令模式(Command)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  8. 大熊君说说JS与设计模式之------命令模式Command

    一,总体概要 1,笔者浅谈 日常生活中,我们在看电视的时候,通过遥控器选择我们喜欢的频道时,此时我们就是客户端的角色,遥控器的按钮相当于客户请求,而具体执行的对象就是命令对象, 命令模式把一个请求或者 ...

  9. [Head First设计模式笔记]----命令模式

    命令模式定义:将“请求”封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作. 类图: 适用设计方案举例:实现一种遥控器,该遥控器具有七个可编程的插槽(每个都可以指 ...

随机推荐

  1. 找回master库中被删除的系统表

    接手的某个数据库实例中,master数据库中的所有系统表都被误删除掉了. 最直接影响就是一旦涉及到要查询这些系统表,就会出现错误. 例如,右键点击某个数据,查看属性时会出现如下图所示错误: 那么怎么找 ...

  2. python os模块 遍历目录

    #os #os ->tree命令 import os #递归 #目录 ->文件,文件夹 -> 文件文件夹 dirpath = input('请输入你要遍历的目录\n') def ge ...

  3. 阿里八八Alpha阶段Scrum(12/12)

    今日进度 俞鋆: 和前端对接,完成了注册接口的对接写了一部分数据同步接口. 李嘉群: 完成了注册界面与服务器的对接 黄梅玲: json数据解析并在listview中显示(还未完成) 王国超: 今天开始 ...

  4. POJ 3415 Common Substrings 【长度不小于 K 的公共子串的个数】

    传送门:http://poj.org/problem?id=3415 题意:给定两个串,求长度不小于 k 的公共子串的个数 解题思路: 常用技巧,通过在中间添加特殊标记符连接两个串,把两个串的问题转换 ...

  5. 安装 Autoconf, Automake & Libtool

    今天在使用sudo apt-get install命令安装autoconf和automake时,出现了问题,说是不能sudo apt-get install安装这些软件似乎不是最新的.由此,我通过搜索 ...

  6. ICSharpCode.SharpZipLib 开源压缩库使用示例

    官方网站:http://www.icsharpcode.net/OpenSource/SharpZipLib/Default.aspx 插件描述: ICSharpCode.SharpZipLib.dl ...

  7. JS简单的倒计时(代码优化)

    倒计时网上一大堆,所以也没有什么好说的,支持:1.年,月,日,天,时分秒等倒计时. JS代码如下: /* * js简单的倒计时 * @param {date,obj} 日期 对象格式 */ funct ...

  8. Python2.7-fractions

    fractions 模块,提供分数格式存储数据,没多大用处,除了模块里的最大公约数函数 gcd(a,b) 模块类和方法: fractions.Fraction(numerator=0, denomin ...

  9. js基础知识整理

    一.javaScript,也称之为js,是专为网页交互设计的脚本语言.主要由以下三部分组成: 1)ECMAScript  由ECMA-262定义,提供核心语言功能. 2)DOM对象(document ...

  10. STM32 & FreeRTOS & KFIFO (巧夺天工)

    巧夺天工 的 KFIFO ,用STM32实现. 实现源文件如下: /********************************************************** * * 文件名 ...