策略模式是行为模式的一种,和模板模式解决的问题一样,实现了通用逻辑和算法细节的解耦合,不同的是模板模式采用继承实现,基类中通用逻辑需要确定下来不可随意更改,策略模式采用组合实现,比较灵活,能在通用逻辑上抽象出接口,方便通用逻辑的变化。
下面给出UML类图和C++代码示例:
#ifndef __STRATEGY_H__
#define __STRATEGY_H__
class IStrategy
{
public:
IStrategy() {}
virtual ~IStrategy() {}
public:
virtual void TestStep1() = 0;
virtual void TestStep2() = 0;
};
class CStrategyA : public IStrategy
{
public:
CStrategyA() {}
virtual ~CStrategyA() {}
public:
virtual void TestStep1() {printf("CStrategyA::TestStep1()\n");}
virtual void TestStep2() {printf("CStrategyA::TestStep2()\n");}
};
class CStrategyB : public IStrategy
{
public:
CStrategyB() {}
virtual ~CStrategyB() {}
public:
virtual void TestStep1() {printf("CStrategyB::TestStep1()\n");}
virtual void TestStep2() {printf("CStrategyB::TestStep2()\n");}
};
class ITarget
{
public:
ITarget(IStrategy* pStrategy) {m_pStrategy = pStrategy;}
virtual ~ITarget() {}
public:
virtual void Test() = 0;
protected:
IStrategy* m_pStrategy;
};
class CTarget : public ITarget
{
public:
CTarget(IStrategy* pStrategy) : ITarget(pStrategy) {}
~CTarget() {}
public:
virtual void Test() {m_pStrategy->TestStep1(); m_pStrategy->TestStep2();}
};
#endif // __STRATEGY_H__#include "stdafx.h"
#include "Strategy.h"
int _tmain(int argc, _TCHAR* argv[])
{
ITarget* pTarA = new CTarget(new CStrategyA);
pTarA->Test();
ITarget* pTarB = new CTarget(new CStrategyB);
pTarB->Test();
getchar();
return 0;
}