组件构建构成中,组件行为的变化经常导致组件本身剧烈的变化;“行为变化”将组件本身和组件行为解耦,从而支持组件行为变化。
command,visitor属于行为变化模式。
motivation:软件构件过程中,“行为请求者”和“行为执行者”常常呈现出紧耦合;在某些场合——例如记录、撤销/重做,事务等处理时,这种无法抵御变化的紧耦合时不适应软件发展的;将一个请求(行为)进行对象化,从而可以使用不同的请求对客户进行参数化。
key interface or class:
1. command接口。
feature: 行为进行对象化。
structure:
template codes:
class Command{
public:
virtual excute()=0;
};
//实现不同的command,或者宏命令
class concreteCommand1: public Command{
public:
excute() override{
//...
}
};
class concreteCommand1: public Command{
public:
excute() override{
//...
}
}
summary:
1. command根本目的在于将“行为请求者”和“行为实现着”进行解耦,常见手段时将行为对象化;
2.concreteCommand可能根据需要保存一些额外的状态信息;
3.command模式和函数指针有点类似,但是两者在定义行为接口上有所区别:command通过“接口-实现”来定义行为接口规范,严格但是由性能损失;函数指针以函数签名来定义接口规范,更灵活性能更高;
4. 在其他语言,如java,c#等中应用更加广泛,因为c++泛型编程(设计模式弥补语言缺陷)。