策略模式:把一系列算法封装起来,使之可以相互替换。这样就可以使算法独立于客户端变化。
如我们有很多排序算法,但是在不通的环境中,需要使用不同算法,那就可以定义一个抽象类,提供统一的接口,然后在各个排序算法继承抽象类,并实现该子类的排序算法 ,再定义一个项目类,通过构造函数传入不同算法类的对象或是模板实例化来表示在不同的项目中用使用不同的算法。哎呀,废话真多,现在比较流行快餐文化哈,那我们直接看UML类图吧:
上面是类图,下面我们看代码,分为通过传入对象指针指定和通过模板实例化指定。
方法1:通过传入对象指针指定:
#include <iostream>
using namespace std;
class Sort //排序算法类
{
public:
virtual void userSort() = 0;//使用排序
virtual ~Sort(){};
};
class BubbleSort : public Sort //冒泡排序算法类
{
public:
virtual void userSort()
{
cout<<"BubbleSort::userSort()"<<endl;
}
};
class SelectSort : public Sort //选择排序算法类
{
public:
virtual void userSort()
{
cout<<"SelectSort::userSort()"<<endl;
}
};
class InsertSort : public Sort //插入排序算法类
{
public:
virtual void userSort()
{
cout<<"InsertSort::userSort()"<<endl;
}
};
class QuickSort : public Sort //快速排序算法类
{
public:
virtual void userSort()
{
cout<<"QuickSort::userSort()"<<endl;
}
};
class Project //项目类,来根据不同的对象替换不同的算法
{
private:
Sort* m_sort;
public:
Project(){}
Project(Sort* sort):m_sort(sort)
{
}
void replaceSort()
{
m_sort->userSort();
}
~Project()
{
if(NULL != m_sort)
{
delete m_sort;
}
}
};
int main(int argc, char** argv)
{
Sort* sort = new InsertSort(); //此处还可以new其他算法类
Project pro(sort);
pro.replaceSort();
return 0;
}
输出结果如下:
方法2:通过模板实例化实现
#include <iostream>
using namespace std;
class Sort //排序算法类
{
public:
virtual void userSort() = 0;//使用排序
virtual ~Sort(){};
};
class BubbleSort : public Sort //冒泡排序算法类
{
public:
virtual void userSort()
{
cout<<"BubbleSort::userSort()"<<endl;
}
};
class SelectSort : public Sort //选择排序算法类
{
public:
virtual void userSort()
{
cout<<"SelectSort::userSort()"<<endl;
}
};
class InsertSort : public Sort //插入排序算法类
{
public:
virtual void userSort()
{
cout<<"InsertSort::userSort()"<<endl;
}
};
class QuickSort : public Sort //快速排序算法类
{
public:
virtual void userSort()
{
cout<<"QuickSort::userSort()"<<endl;
}
};
template<typename T>
class Project //项目类,来根据不同的对象替换不同的算法
{
private:
T m_sort;
public:
Project(){}
void replaceSort()
{
m_sort.userSort();
}
};
int main(int argc, char** argv)
{
Project<QuickSort> pro;//此处还可以实例化其他算法
pro.replaceSort();
return 0;
}
输出结果如下:
其实上面代码有点啰嗦了,通过对象指针和模板实例化实现仅仅Project类和main函数存在一些区别,就将就下吧!!!!!
以上代码在VC6.0上运行OK。