策略模式:
它定义了算法家族,分别封装起来,让它们之间可以互相替换。此模式让算法的变化,不会影响到使用算法的客户。
结构图如下:
代码:
//算法抽象类
class Strategy
{
//定义支持的算法接口
public viod Algorithminterface();
}
//算法子类A
class StrategyChildA : Strategy
{
//算法A的具体实现
public viod Algorithminterface();
}
//算法子类B
class StrategyChildB : Strategy
{
//算法A的具体实现
public viod Algorithminterface();
}
//Context类
class Context
{
Strategy strategy ;
public:
//构造时初始化具体的策略对象
Context(Strategy strategy )
{
this.strategy = strategy;
}
//根据具体策略,调用其具体算法
void ContextInterface()
{
strategy.Algorithminterface();
}
}
//客户端代码
Context context;
context = new Context(new StrategyChildA() );
context.ContextInterface();//使用算法A的计算结果
进阶版——策略工厂:
//Context类
class Context
{
Strategy strategy ;
public:
//可支持的具体策略
typedef enum TagEnumstrategy{
StrategyChildA ,
StrategyChildB ,
StrategyChildEnd,
}Enumstrategy;
//构造时初始化具体的策略对象
Context(Enumstrategy enumstrategy )
{
switch(enumstrategy)
{
case StrategyChildA:
this.strategy = new StrategyChildA() ;
break;
case StrategyChildB:
this.strategy = new StrategyChildB() ;
break;
}
}
//根据具体策略,调用其具体算法
void ContextInterface()
{
strategy.Algorithminterface();
}
}
//客户端代码
Context* context = null;
context = new Context(StrategyChildA );//比起单纯的策略模式或简单工厂模式,客户端只依赖一个context类,连Strategy父类都不依赖。
context.ContextInterface();//使用算法A的计算结果
优点:策略模式封装任意类型的规则,只要需要在不同情况下应用不同的规则算法,就可以考虑策略模式;和简单工厂相比,简单工厂生产具体产品,策略上下文给出具体结果。
缺点:违背开放-封闭原则,每次增改都需要上下文类。并且需要对客户暴露所有策略。