C++与设计模式(2)--策略模式
来源:互联网 发布:webpack搭建php服务器 编辑:程序博客网 时间:2024/05/16 23:55
策略模式
策略模式是指提供接口,让用户使用可替换的算法。
enum ALG {first, second, third}; //标签 //抽象接口 class Algorithm { public: virtual void alg() = 0; }; //三种具体的替换算法 class Algorithm1 : public Algorithm { public: void alg() { cout << "Algorithm1" << endl; } }; class Algorithm2 : public Algorithm { public: void alg() { cout << "Algorithm2" << endl; } }; class Algorithm3 : public Algorithm { public: void alg() { cout << "Algorithm3" << endl; } };class User { private: Algorithm *m_al; public: User(enum ALG a) { if(a == first) m_al = new Algorithm1(); else if(a == second) m_al = new Algorithm2(); else if(a == third) m_al = new Algorithm3(); else m_al = NULL; } ~User() { delete m_ra; } void alg() { m_ra->alg(); } };int main() { Cache cache(first); //指定算法标签 cache.Replace(); return 0; }
这里使用标签来区分不同的算法,可以看出这么做会难以进行扩展。
使用函数指针和匿名函数会对策略模式有很大的帮助,举个例子:
struct Info{ int a; int b; int c;};template <class L>class Vector{public: template <class T> void sort(T t) { int i, j; for (i = 0; i < InfoList.size(); i++) for (j = 1; j < InfoList.size() - i; j++) if (t(InfoList[j - 1],InfoList[j]))//依据用户提供的算法进行比较 std::swap(InfoList[j - 1], InfoList[j]); }private: vector<L> InfoList;};int main(){ Vector<Info> l; l.sort([](Info x,Info y){if(x.a>y.a)return 1;else return 0;});}
在这个例子中我们遇到了一个’复杂’的数据-由三个int组成的结构体,我们不知道如何对其进行排序,所以我们的sort函数提供了一个参数,用于接受比较函数,在例子中提供的函数依据结构体中的a值进行比较,那么sort就会依据这个算法进行排序。
0 0
- 设计模式C++(Strategy策略模式)
- 设计模式C++(Strategy策略模式)
- C++与设计模式(2)--策略模式
- 设计模式:2)策略设计模式
- 设计模式 -- 策略模式 + 简单工程模式(C++)
- 设计模式(策略模式2)
- java设计模式(2)策略模式
- C++设计模式(2):策略模式
- 设计模式:2策略模式
- 设计模式【2】:策略模式
- 设计模式(策略模式)
- 设计模式(策略模式)
- 设计模式(策略模式)
- 设计模式(策略模式)
- 设计模式解读 之策略模式(参照策略模式与简单工厂模式的对比)
- 设计模式实现(二)---策略模式、策略模式与简单工厂模式结合使用
- 设计模式解读 之策略模式(参照策略模式与简单工厂模式的对比)
- C语言和设计模式(策略模式)
- C++动态内存操作
- 107. Binary Tree Level Order Traversal II (二叉树由底向上层次遍历)
- Day53、表连接、合并结果集、组函数和分组、子查询、表操作(创建、删除、更新)、事务控制语句
- OSG开源教程
- 欢迎使用CSDN-markdown编辑器
- C++与设计模式(2)--策略模式
- 110. Balanced Binary Tree (平衡二叉树判断)
- [struts2]严重: Dispatcher initialization failed java.lang.RuntimeException: java.lang.reflect.Invocati
- 浮雕效果一键工具
- CSS学习笔记:层叠和继承
- 重新学习C语言——比较两个数大小
- 8086指令
- ps快捷键总结
- 单链表实现多项式相加