一、学前思考
1.命令模式可以应用到撤回和反撤回功能的使用
2.个人理解:命令模式就是把请求的执行请求的行为隔离
二、行为模式之Command(命令模式)
1.动机
将行为实现着和行为请求者解耦,因为在诸如对行为进行“记录、撤销/反撤销(undo/redo)、事物”等处理中这种无法抵御变化的紧耦合是合适的。
2.模式定义
将一个请求(行为)封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销操作。
3.结构
泛化关系实际就是继承关系。
实现关系实际上就是实现某一个接口,用带箭头虚线表示
关联关系用带箭头实线表示,表示一个类还持有一个对象或者另一个类
4.要点总结
- Command模式的根本目的在于将“行为请求者”与“行为实现者”解耦,在面向对象语言中,常见的实现手段是“将行为抽象为对象”
- 实现Command接口的具体命令对象ConcreteCommand有时候根据需要会保存一些额外的状态信息。通过使用Composite模式,可以将多个命令封装成一个“复合命令”MacroCommand
- Command模式于C++中的函数对象有点类似。的那两者定义行为接口的规范有所区别:Command以面向对象中的“接口-实现”来定义行为接口规范,更严格。但有性能损失;C++函数对象以函数签名来定义行为接口,更灵活,性能更高。
5.实例
/**
Receiver接受者,命令传递到这儿就被执行
Command命令,所有命令在此声明
Invoker调用者,接受到命令并且执行命令
**/
class Receiver
{
protected:
Receiver();
public:
virtual ~Receiver() = 0;
virtual void doSomething()=0;
};
class ConcreteReceiver:public Receiver
{
public:
void doSomething()
{
cout << "doSomething...."<<endl;
}
};
claas Command
{
protected:
Command();
public:
virtual ~Command() = 0;
virtual void execute() = 0;
};
class ConcreteCommand:public Command
{
public:
ConcreteCommand(Receiver* re)
:_receiver(re)
{}
~ConcreteCommand(){}
void execute()
{
_receiver.doSomething();
}
protected:
Receiver * _receiver;
};
class Invoke
{
private:
Command * _cmd;
public:
void setCommand(Command * cmd)
{
_cmd = cmd;
}
void action()
{
_cmd->execute();
}
};
三、散装知识点、问题
1.invoker:调用程序
2.行为抽象为对象的方式是将一个方法抽象为一个类然后再实例化调用这个方法调用它是吗?
3.元编程是什么?
元编程简言:就是用代码生成(操纵)代码。
元编程应用场景:扩展(重构)语法、开发DSL、生成代码、根据特定场景自动选择代码优化、解决一些正交的架构设计问题、AOP等等
目的:多提供了一个抽象层次
4.C++用到命令模式的地方基本都被函数对象代替了,因为C++是以性能优先的。java、C#等语言中这种模式被广泛应用。
5.和迭代器模式类似,都用的少,被泛型编程代替了。