1、意图:定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
2、结构:

3、应用场合:
1)、许多相关的类仅仅是行为有异。”策略“提供了一种用多个行为中的一个行为来配置一个类的方法。
2)、需要使用一个算法的不同变体。
3)、算法使用客户不应该知道的数据。策略模式以避免暴露复杂的、与算法相关的数据结构。
4)、一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入各自的策略类中。
4、参与者
1)、策略(Strategy):
定义所有支持的算法的公共接口。
2)、具体策略(ConcreteStrategy):
实现策略中定义接口,用于实现某具体算法。
3)、上下文(Context):
用一个具体策略对象配置;维护一个对策略对象的引用;可定义一个接口让策略访问它的数据。
5、协作:
具体的算法由客户进行确定。
6、实现:
C++实现的策略模式代码;
// Defines the entry point for the console application.
//
#include "stdafx.h"
#include "ConcreteStrategy.h"
#include "Context.h"
int main(int argc, char* argv[])
{
//printf("Hello World!\n");
//用哪种算法由客户确定
ConcreteStrategy_A strategyA;
ConcreteStrategy_B strategyB;
//使用A策略
Context context(&strategyA);
context.Run();
//动态更改为B策略
context.SetStrategy(&strategyB);
context.Run();
//更改回A策略
context.SetStrategy(&strategyB);
context.Run();
return 0;
}
#ifndef _CONTEXT_H_
#define _CONTEXT_H_
#include "strategy.h"
class Context
{
private:
strategy *p_strategyObj;
public:
Context(strategy *p_strategyObj);
~Context();
void Run();
void SetStrategy(strategy *p_strategyObj);
};
#endif/*_CONTEXT_H_*/
//
#include "stdafx.h"
#include "Context.h"
Context::Context(strategy *p_strategyObj)
{
//TODO:ADD CONTEXT INIT
printf("Create Context Object!\n");
Context::p_strategyObj = p_strategyObj;
}
Context::~Context()
{
//TODO:ADD CONTEXT END
printf("Del Context Object!\n");
}
void Context::Run()
{
//CALL STRATEGY
// printf("Call Algorithm!\n");
p_strategyObj->AlgorithmInterface();
}
void Context::SetStrategy(strategy *p_strategyObj)
{
printf("modify strategy!\n");
Context::p_strategyObj = p_strategyObj;
}
#ifndef _STRATEGY_H_
#define _STRATEGY_H_
class strategy{
private:
public:
strategy(){};
~strategy(){};
virtual void AlgorithmInterface() = 0;
};
#endif/*_STRATEGY_H_*/
#ifndef _CONCRETE_STRATEGY_H_
#define _CONCRETE_STRATEGY_H_
#include "strategy.h"
class ConcreteStrategy_A:public strategy{
private:
public:
ConcreteStrategy_A();
~ConcreteStrategy_A();
void AlgorithmInterface();
};
class ConcreteStrategy_B:public strategy{
private:
public:
ConcreteStrategy_B();
~ConcreteStrategy_B();
void AlgorithmInterface();
};
#endif/*CONCRETE_STRATEGY_H_*/
// ConcreteStrategy.cpp : concrete strategy class
//
#include "stdafx.h"
#include "ConcreteStrategy.h"
ConcreteStrategy_A::ConcreteStrategy_A()
{
//TODO:ADD INIT
printf("Create ConcreteStrategy_A Object!\n");
}
ConcreteStrategy_A::~ConcreteStrategy_A()
{
//TODO ADD END
printf("Del ConcreteStrategy_A Object!\n");
}
void ConcreteStrategy_A::AlgorithmInterface()
{
printf("Useing algorithm A!\n");
}
ConcreteStrategy_B::ConcreteStrategy_B()
{
//TODO:ADD INIT
printf("Create ConcreteStrategy_B Object!\n");
}
ConcreteStrategy_B::~ConcreteStrategy_B()
{
//TODO:ADD END
printf("Del ConcreteStrategy_B Object!\n");
}
void ConcreteStrategy_B::AlgorithmInterface()
{
printf("Useing algorithm B!\n");
}
完整的工程代码请到网址 http://download.youkuaiyun.com/detail/apn172/4952123下载
7、类别:对象行为型模式