策略模式
1、策略模式简介
在GOF的《设计模式:可复用面向对象软件的基础》一书中对策略模式是这样说的:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。该模式使得算法可独立于使用它的客户而变化。
2、策略模式应用场景
1)如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
2)一个系统需要动态地在几种算法中选择一种。
3)如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
3、策略模式和简单工厂模式的区别
简单工厂模式是创建型模式,而策略模式是行为模式。可参考简单工厂模式实例。简单工厂模式中,旨在根据用户的需求条件构建一个用户想要的对象。而策略模式对象则是已存在的,不过是每个对象的行为不同,通过父类的调用去执行此对象的方法。
经典例子:
斧子有很多种,有一个工厂专门负责生产各种需求的斧子。
工厂模式:
1)根据你给出的目的来生产不同用途的斧子,例如要砍人,那么工厂生产砍人斧子,要伐木就生产伐木斧子。
2)即根据你给出一些属性来生产不同行为的一类对象返回给你。
3)关注对象创建
策略模式:
1)用工厂生产的斧子来做对应的事情,例如用砍人的斧子来砍人,用伐木的斧子来伐木。
2)即根据你给出对应的对象来执行对应的方法。
3)关注行为的选择
总结:简单工厂模式:根据客户选择的条件,来帮客户创建一个对象。
策略模式:客户给它一个创建好的对象,它来帮客户做相应的事。
4、策略模式代码示例
//策略类
class Strategy
{
public:
virtual void DoSomething() = 0;
};
class MethodA : public Strategy
{
public:
void DoSomething()
{
cout<<"this is MethodA."<<endl;
}
};
class MethodB : public Strategy
{
public:
void DoSomething()
{
cout<<"this is MethodB."<<endl;
}
};
class MethodC : public Strategy
{
public:
void DoSomething()
{
cout<<"this is MethodC."<<endl;
}
};
class Context
{
public:
Context(Strategy *pStrategy) : m_pStrategy(pStrategy)
{
}
void Execute()
{
m_pStrategy->DoSomething();
}
private:
Strategy *m_pStrategy;
};
int main()
{
//创建具体的策略对象
Strategy *pStrategy = new MethodA;
//创建调用策略的对象
Context *pContext = new Context(pStrategy);
//调用策略的方法
pContext->Execute();//打印 this is MethodA
rerurn 0;
}