盘点c++几种常见的设计模式及具体实现( 三 )

(这个实例网上也有人用命令模式实现 。命令模式请看我后面的博客 。把冷风,热风,无风作为一种命令 。当然这是另外一种思路,也未尝不可 。但是我觉得如果采用命令模式 。类的个数会相应增加(增加系列的命令类),造成额外的开销 。当添加一个新模式的时候,你需要添加的类过多 。或多或少不是那么明智 。所以我个人认为在这里策略模式更好一些 。)
总的说来策略模式:
优点:
1、 使用策略模式可以避免使用多重条件转移语句 。多重转移语句不易维护 。
2、 策略模式让你可以动态的改变对象的行为,动态修改策略
缺点:
1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类 。
2、类过多---策略模式造成很多的策略类,每个具体策略类都会产生一个新类 。(这点可以通过享元模式来克服类过多)
模式定义:命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象 。命令模式也支持可撤销的操作 。
命令对象将动作和接受者包进对象中,这个对象只暴露一个execute()方法 。
当需要将发出请求的对象和执行请求的对象解耦的时候,使用命令模式 。
模式结构:

盘点c++几种常见的设计模式及具体实现

文章插图
 
举例:遥控器上有一个插槽,可以放上不同的装置,然后用按钮控制 。我们这里放置电灯,并有开和关按钮 。可以命令模式实现 。
UML设计:
盘点c++几种常见的设计模式及具体实现

文章插图
 
其中,RemoteControl为遥控器,LightOnCommand为开灯请求对象,LightOffCommand为关灯请求对象,他们继承自基类Command,这样设计可以使插槽在以后防止其他的装置 。
#include <iostream> using namespace std; //电灯类class Light{public: void on() {cout << "Light on !" << endl; }void off() {cout << "Light off !" << endl; }};//命令类class Command{public: virtual void execute(){}};//具体命令类class LigthOnCommand : public Command{public: LigthOnCommand(Light* lig):light(lig){} //execute方法 void execute() {light->on(); }private: Light* light;}; class LigthOffCommand : public Command{public: LigthOffCommand(Light* lig):light(lig){} void execute() {light->off(); }private: Light* light;}; //遥控器类class RemoteControl{public: void setCommand(Command* command) {slot = command; } void buttonOn() {slot->execute(); }private: Command* slot;};//客户代码int main(){ RemoteControl lightOnControl; RemoteControl lightOffControl;Command* onCommand = new LigthOnCommand(new Light()); Command* offCommand = new LigthOffCommand(new Light());lightOnControl.setCommand(onCommand); lightOffControl.setCommand(offCommand);lightOnControl.buttonOn(); lightOffControl.buttonOn();return 0;}执行结果:
Lighton !
Lightoff !
请按任意键继续. .

【盘点c++几种常见的设计模式及具体实现】


推荐阅读