首页 > 技术文章 > 策略模式之两型 -- 动态策略模式和静态策略模式

asa-ben-clc 2021-03-03 18:20 原文

策略模式一般是反应面向对象语言的多态特性,即可在运行时更改或选择不同的策略,典型的使用方式如下:

class Strategy
{
public:
Strategy() {}
virtual ~Strategy() {}
virtual int stopTask() = 0;
};

//策略A
class Strategy_A : public Strategy
{
public:
Strategy_A(): Strategy() {}
~Strategy_A() {}
//virtual
int stopTask()
{
//do your strategy-A
}
};

//策略B
class Strategy_B : public Strategy
{
public:
Strategy_B(): Strategy() {}
~Strategy_B() {}
//virtual
int stopTask()
{
//do your strategy-B
}
};

//使用时,你可以根据情况或条件(变量),让父对象指针指向一个实际构造的子对象

  Strategy* pOptionChose = new Strategy_B(); //遇到其他情况,你也可以指向一个new Strategy_A()


-------------------------------------------------
以上就是一般的策略模式的用法,可以称之为动态策略模式;
实际上C++也可以用模板来实现,或称之为静态策略模式,这样实现的策略模式有编译期特性,即一经编译即固化了策略,特别适用于面向不同的客户做定制化方案的情形。
其用法如下:

class StrategyA
{
public:
void fun_1()
{
//do your strategy-A's fun_1
}

//....

void fun_n()
{
//do your strategy-A's fun_n
}

};

class StrategyB
{
public:
void fun_1()
{

//do your strategy-B's fun_1
}

//...

void fun_n()
{
//do your strategy-B's fun_n
}

};

template<class T>
class Context
{
public:
void fun_1()
{
strategy.fun_1();
}

//...

void fun_n()
{
strategy.fun_n();
}

private:
T strategy;
};


如上所示,类StrategyA和StrategyB除了有同样的fun_1()到fun_n()这n个同名的方法外,并没有其他关系;
模板类Context<T>中也有上述n个同名方法,实际使用时,只有根据情况具象化一个自己想要的一个策略实例即可,比如Context<StrategyA> intance;
然后让实例intance调用任何想要的方法就可以了,比如intance.fun_1();就是执行类StrategyA中的fun_1()方法。

推荐阅读