设计模式 笔记 命令模式 Command
//---------------------------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的更多相关文章
- 设计模式 ( 十三 ) 命令模式Command(对象行为型)
设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需 ...
- 乐在其中设计模式(C#) - 命令模式(Command Pattern)
原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...
- 面向对象设计模式_命令模式(Command)解读
在.Net框架中很多对象的方法中都会有Invoke方法,这种方法的设计实际是用了设计模式的命令模式, 模式图如下 其核心思路是将Client 向Receiver发送的命令行为进行抽象(ICommand ...
- 二十四种设计模式:命令模式(Command Pattern)
命令模式(Command Pattern) 介绍将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可取消的操作. 示例有一个Message实体类,某个 ...
- 设计模式-15命令模式(Command Pattern)
1.模式动机 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使 ...
- [设计模式] 14 命令模式 Command
Command 模式通过将请求封装到一个对象(Command)中,并将请求的接受者存放到具体的 ConcreteCommand 类中(Receiver)中,从而实现调用操作的对象和操作的具体实现者之间 ...
- 设计模式之命令模式(Command)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 大熊君说说JS与设计模式之------命令模式Command
一,总体概要 1,笔者浅谈 日常生活中,我们在看电视的时候,通过遥控器选择我们喜欢的频道时,此时我们就是客户端的角色,遥控器的按钮相当于客户请求,而具体执行的对象就是命令对象, 命令模式把一个请求或者 ...
- [Head First设计模式笔记]----命令模式
命令模式定义:将“请求”封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作. 类图: 适用设计方案举例:实现一种遥控器,该遥控器具有七个可编程的插槽(每个都可以指 ...
随机推荐
- c#创建文件( File.Create() )后对文件写操作出错的分析
在C#中,使用system.IO.File.Create()创建完一个文件之后,如果需要对这个文件进行写操作,会出现错误,提示你“这个文件正在被使用”. 原因是System.IO.File.Creat ...
- bufferIO,Direct io,mmap, ZeroCopy
1 bufferIO(传统IO),Direct io(干掉内核cache),mmap(大数据映射),zeroCopy(网络IO) 2 linux 5种IO 3NIO 相关知识 这张图展示了mmap() ...
- linux访问Windows共享文件命令
mount -o username=username,password=password,ip=10.0.0.1 //10.0.0.1/backupscm /home/package/image_vm ...
- 从PFX文件中获取私钥、公钥证书、公钥
https://blog.csdn.net/ZuoYanYouYan/article/details/77868584 该类具体功能:根据pfx证书得到私钥.根据私钥字节数组获取私钥对象.根据公钥字节 ...
- 题解 P2701 【[USACO5.3]巨大的牛棚Big Barn】
题面 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚. 他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方. 我们假定,他的农场划分成 N x N 的方格.输入数据中包括有树的 ...
- 1.js基础(以通俗易懂的语言解释JavaScript)
1.JavaScript组成: ECMAScript: 解释器.翻译 -->几乎没有兼容问题 DOM: Document Object Model -->有一些操作不兼容 BOM: Bro ...
- 列表操作方法,元祖,for循环嵌套
li = ['alex','wusir''女神']增 1.增加到列表末位 li.append() 连续增加,输入q停止 li = ['alex','wusir''女神'] while 1: s = i ...
- 魔法少女【动态规划问题】——NYOJ1204
个人博客页:https://www.scriptboy.cn/202.html 题目描述: 前些时间虚渊玄的巨献小圆着实火了一把. 在黑长直(小炎)往上爬楼去对抗魔女之夜时,她遇到了一个问题想请你帮忙 ...
- OpenCV——滤波
常见滤波函数: 其中前3中为线性滤波,后2中为非线性滤波 参考资料:https://mp.weixin.qq.com/s/3maNqlTSkl6FQs_xqrs8Fg
- Arduino入门笔记(2):Arduino的开发和virtualbreadboard仿真环境
欢迎加入讨论群 64770604 1.开发环境 (1)下载开发环境 Arduino的开发环境从http://arduino.cc/en/Main/Software官网下载即可,分为windows版本. ...