设计模式学习笔记--策略模式
2015-06-12 16:15
387 查看
定义:
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。我们在使用一些功能时,有时有很多种实现方法,或者多种结果,但是都有同样的使用方法,即调用接口,这就是策略模式。
例子:
// 设计模式Demo.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <string> using namespace std; //交通策略基类,定义一个策略接口 class TrafficStrategyBase { public: virtual void goHome() = 0; }; //步行策略 class WalkStragety : public TrafficStrategyBase { public: void goHome() override { cout<<"go home on foot"<<endl; } }; //开车策略 class DriveStrategy : public TrafficStrategyBase { public: void goHome() override { cout<<"go home by car"<<endl; } }; //客户端 int _tmain(int argc, _TCHAR* argv[]) { //使用开车策略 TrafficStrategyBase* strategy = new DriveStrategy(); strategy->goHome(); //使用步行策略 strategy = new WalkStragety(); strategy->goHome(); system("pause"); return 0; }
结果:
go home by car
go home on foot
上面是一个最简单的策略模式,其实就是一个C++的多态,使用父类指针调用子类功能,而不必知道子类具体是什么。
但是这个例子有很多弊病,在客户端需要知道各种模式不利于修改。
下面是一个简单的优化,将策略模式和简单工厂模式结合:
// 设计模式Demo.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <string> using namespace std; //交通策略基类,定义一个策略接口 class TrafficStrategyBase { public: virtual void goHome() = 0; }; //步行策略 class WalkStragety : public TrafficStrategyBase { public: void goHome() override { cout<<"go home on foot"<<endl; } }; //开车策略 class DriveStrategy : public TrafficStrategyBase { public: void goHome() override { cout<<"go home by car"<<endl; } }; enum TrafficStrategy { Walk,Drive }; //简单工厂类(策略工厂) class StrategyFactory { public: TrafficStrategyBase* CreateStrategy(TrafficStrategy s) { switch (s) { case Walk: return new WalkStragety(); case Drive: return new DriveStrategy(); default: return nullptr; } } }; //客户端 int _tmain(int argc, _TCHAR* argv[]) { //使用开车策略回家 StrategyFactory* factory = new StrategyFactory(); factory->CreateStrategy(Drive)->goHome(); //使用步行策略回家 factory->CreateStrategy(Walk)->goHome(); system("pause"); return 0; }
这里,客户端就与各种策略本身没有关系了,我们只需要修改简单工厂的参数,就可以创建相应的策略,用相应的方法进行操作了。参数可以改成配置文件中读取的字符串,更加利于扩展。
更进一步,我们可以使用工厂方法模式+反射,不需要修改客户端代码可以更改使用的策略。但是C++本身不带反射机制,虽然有实现反射机制的方法,不过本人暂时不会。。。 有机会填坑吧。
相关文章推荐
- Leetcode 226 Invert Binary Tree
- Android 使用Intent在活动之间传递数据
- UtraISO制作系统光盘镜像
- Microsoft.VisualStudio.Shell.14.0.dll 文件位置
- Android Phone Pad UI设计主流分辨率
- Java基础数据类型
- 国外程序员整理的 C++ 资源大全
- CentOS 6.5添加/绑定IP
- 一致性hash算法和CEPH CRUSH
- #笔记#圣思园 JavaSE 第72讲——JUnit框架
- 某个较陌生领域的文献查阅思路
- 让敏捷工具在敏捷开发中发挥高效作用
- linux svn环境搭建
- MongoDB管道聚合各阶段示例
- 大数据变现的九种商业模式
- 基于openfire和spark的二次开发。
- 详细讲解nodejs中使用socket的私聊的方式
- LeetCode之“动态规划”:Interleaving String
- 使用Monkeyrunner进行Android自动化的总结
- 黑马程序员---IOS基础---OC 中对象和方法