1.策略模式概述
1.1、意图
定义一系列算法,把他们一个个封装起来,并且使他们可相互替换。使得算法可独立于使用它的客户而变化。
1.2、适用性
- 许多相关的类仅仅是行为有异。可以用多个行为中的一个行为来配置一个类的方法。
- 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Stategy类中代替这些条件语句。
- Context类使用Strategy类实现一个接口完成不同功能。
- ConcreteStrategy重写AlgorithmInterface()方法实现具体功能。
2.代码示例
//Strategy类
class CountryStrategy {
public:
CountryStrategy() {}
virtual ~CountryStrategy(){}
virtual void whichContury() = 0;
};
//ConcreteStrategyA
class ChinaCountry : CountryStrategy {
public:
virtual void whichContury() {
std::cout << "中国" << std::endl;
}
};
//ConcreteStrategyB
class AmericaCountry : CountryStrategy {
public:
virtual void whichContury() {
std::cout << "美国" << std::endl;
}
};
//ConcreteStrategyC
class FranceCountry : CountryStrategy {
public:
virtual void whichContury() {
std::cout << "法国" << std::endl;
}
};
//Context类
class CountryRegister {
CountryStrategy *m_countryStrategy;
public:
CountryRegister(CountryStrategy *countryStrategy) {
m_countryStrategy = countryStrategy;//这边应该使用工厂模式生产
}
void registerCountry() {
m_countryStrategy->whichContury();
}
};
int main()
{
FranceCountry france;
AmericaCountry america;
ChinaCountry china;
CountryRegister country1((CountryStrategy *)&france);
country1.registerCountry();
CountryRegister country2((CountryStrategy *)&america);
country2.registerCountry();
CountryRegister country3((CountryStrategy *)&china);
country3.registerCountry();
system("pause");
return 0;
}
输出结果: