一、解决的问题:
Strategy模式和Template 模式要解决的问题是相同(类似)的,都是为了给业务逻辑(算法)具体实现和抽象接口之间的解耦。Strategy模式将逻辑(算法)封装到一个类(contex)里面,通过组合的方式将具体算法的实现在组合对象中实现,再通过委托的方式将抽象接口的实现委托给组合对象实现。St a t e 模式也有类似的功能,他们之间的区别将在讨论中给出。
二、Strategy模式的类图
三、策略模型案例
举一个例子:一个人想去旅行,旅行的方式有很多种(比如:徒步旅行、乘坐飞机、乘坐大巴...等待)
我们可以从中间抽象出来一个策略算法就是旅行方式,一个应用场景就是人需要应用,代码如下:
#include <iostream>
/**
* @brief 策略类接口。
* @note no
* @warning no
* @see no
*/
class TravelStrategy
{
public:
virtual void travel() = 0;
};
/**
* @brief 策略类:乘坐公共汽车旅行的一种策略类。
* @note no
* @warning no
* @see no
*/
class Bustravel : public TravelStrategy
{
public:
Bustravel();
~Bustravel();
virtual void travel();
private:
};
Bustravel::Bustravel()
{
}
Bustravel::~Bustravel()
{
}
void Bustravel::travel()
{
std::cout << "BusTravel..." << std::endl;
}
/**
* @brief 策略类:徒步旅行的一种策略类。
* @note no
* @warning no
* @see no
*/
class Walktravel : public TravelStrategy
{
public:
Walktravel();
~Walktravel();
virtual void travel();
};
Walktravel::Walktravel()
{
}
Walktravel::~Walktravel()
{
}
void Walktravel::travel()
{
std::cout << "WalkTravel..." << std::endl;
}
/**
* @brief 上述contex类一个旅行者类。
* @note no
* @warning no
* @see no
*/
class Person
{
public:
Person(TravelStrategy* pTravelStrategy);
~Person();
void travel();
private:
TravelStrategy* m_travelStrategy;
};
Person::Person(TravelStrategy* pTravelStrategy)
{
m_travelStrategy = pTravelStrategy;
}
Person::~Person()
{
if (m_travelStrategy)
{
delete m_travelStrategy;
m_travelStrategy = NULL;
}
}
void Person::travel()
{
if (m_travelStrategy)
{
m_travelStrategy->travel();
}
else
{
std::cout << "cont not set travel stategy..." << std::endl;
}
}
//客户端使用
int main(int argc, char* argv[])
{
Person person(new Walktravel);
person.travel();
Person BusPerson(new Bustravel);
BusPerson.travel();
return 0;
}
输出结果:
WalkTravel...
BusTravel...
请按任意键继续. . .
策略模式是一种定义算法家族的方法,从概念上说所有算法都是为了实现同样的目的,只是实现不同而已。