1.定义
策略模式是指定义一系列的算法,把每一个算法封装起来,使他们可以相互替换,使得算法可以独立于使用它的客户而变化。
2. 组成
环境类(Context): 内部维护一个Strategy对象的引用,对外提供相应功能接口;
策略类(Strategy): 定义算法的一个或多个接口;
具体策略类(ConcreteStrategy): 以Strategy接口实现某个特定算法;
3. 类关系图
4. 效果
优点:策略模式把算法进行归纳,使得算法的切换、扩展更加容易。
缺点:策略使用者需要了解各个具体策略,使得整个模式的封装性不强。
5.C++实现
实现策略模式时,需要注意的是算法接口的定义。如果能把算法运行所需信息提供完整,避免算法类访问Context,则可减少Context与Strategy之间的耦合。
/*******************/
/* Strategy.h */
/*******************/
#ifndef __STRATEGY_H__
#define __STRATEGY_H__
class Strategy
{
public:
virtual void AlgorithmFunction() = 0;
};
class ConcreteStrategyA : public Strategy
{
public:
void AlgorithmFunction();
};
class ConcreteStrategyB : public Strategy
{
public:
void AlgorithmFunction();
};
class ConcreteStrategyC : public Strategy
{
public:
void AlgorithmFunction();
};
#endif //__STATEGY_H__
/********************/
/* Strategy.cpp */
/********************/
#include "Strategy.h"
#include <stdio.h>
void ConcreteStrategyA::AlgorithmFunction()
{
printf("我是一只策略A,咿呀咿呀哟~""\n");
}
void ConcreteStrategyB::AlgorithmFunction()
{
printf("天空一声巨响,策略B闪亮登场~""\n");
}
void ConcreteStrategyC::AlgorithmFunction()
{
printf("策略C低调撸过…""\n");
}
/******************/
/* Context.h */
/******************/
#ifndef __CONTEXT_H__
#define __CONTEXT_H__
#include "Strategy.h"
enum enum_StrategyName
{
enum_val_StrategyA,
enum_val_StrategyB,
enum_val_StrategyC
};
class Context
{
public:
Context(enum_StrategyName strategyName = enum_val_StrategyA);
void SetStrategy(enum_StrategyName strategyName);
void WorkFunction();
private:
Strategy * m_pStrategy;
};
#endif //__CONTEXT_H__
/*******************/
/* Context.cpp */
/*******************/
#include "Context.h"
Context::Context(enum_StrategyName strategyName/* = enum_val_StrategyA*/)
{
switch(strategyName)
{
case enum_val_StrategyA:
m_pStrategy = new ConcreteStrategyA();
break;
case enum_val_StrategyB:
m_pStrategy = new ConcreteStrategyB();
break;
case enum_val_StrategyC:
m_pStrategy = new ConcreteStrategyC();
break;
default:
m_pStrategy = new ConcreteStrategyA();
}
}
void Context::WorkFunction()
{
m_pStrategy->AlgorithmFunction();
}
/*********************/
/* Main.cpp */
/*********************/
#include "Context.h"
#include <stdio.h>
#include <conio.h>
int main(int argc, char * argv[])
{
Context * pContextA = new Context(enum_val_StrategyA);
Context * pContextB = new Context(enum_val_StrategyB);
Context * pContextC = new Context(enum_val_StrategyC);
pContextA->WorkFunction();
pContextB->WorkFunction();
pContextC->WorkFunction();
delete pContextA;
delete pContextB;
delete pContextC;
printf("\n""按下任意键继续…""\n");
_getch();
return 0;
}
运行截图:
=========================End===================================