关键在于将算法的逻辑抽象接口(DoAction)封装到一个类中(Context),再通过委托的方式具体的算法实现委托给具体的strategy类来实现(ConcreteStrategyA类)
Context封装角色
它也叫做上下文角色,起承上启下封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。
Strategy抽象策略角色
策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性。
ConcreteStrategy具体策略角色
实现抽象策略中的操作,该类含有具体的算法
实现demo
class Strategy
{
public:
Strategy();
virtual ~Strategy();
virtual void AlgrithmInterface()=0;
protected:
private:
};
class ConcereteStrategyA :public Strategy
{
public:
ConcereteStrategyA();
virtual ~ConcereteStrategyA();
virtual void AlgrithmInterface();
protected:
private:
};
class ConcereteStrategyB :public Strategy
{
public:
ConcereteStrategyB();
virtual ~ConcereteStrategyB();
virtual void AlgrithmInterface();
protected:
private:
};
class Context
{
public:
Context(Strategy *pStrategy);
~Context();
void DoAction();
protected:
private:
Strategy *m_pStratey;
};
#include "Strategy.h"
#include <iostream>
Strategy::Strategy()
{
std::cout << "Strategy..." << std::endl;
}
Strategy::~Strategy()
{
std::cout << "~Strategy..." << std::endl;
}
ConcereteStrategyA::ConcereteStrategyA()
{
std::cout << "ConcereteStrategyA..." << std::endl;
}
ConcereteStrategyA::~ConcereteStrategyA()
{
std::cout << "~ConcereteStrategyA..." << std::endl;
}
void ConcereteStrategyA::AlgrithmInterface()
{
std::cout << "ConcereteStrategyA AlgrithmInterface..." << std::endl;
}
ConcereteStrategyB::ConcereteStrategyB()
{
std::cout << "ConcereteStrategyB..." << std::endl;
}
ConcereteStrategyB::~ConcereteStrategyB()
{
std::cout << "ConcereteStrategyB..." << std::endl;
}
void ConcereteStrategyB::AlgrithmInterface()
{
std::cout << "ConcereteStrategyB AlgrithmInterface..." << std::endl;
}
Context::Context(Strategy *pStrategy)
{
m_pStratey = pStrategy;
}
Context::~Context()
{
if (m_pStratey)
{
delete m_pStratey;
m_pStratey = nullptr;
}
}
void Context::DoAction()
{
m_pStratey->AlgrithmInterface();
}
int main(int argc, char* argv[])
{
Strategy *pStrategy = new ConcereteStrategyA();
Context *pContext = new Context(pStrategy);
pContext->DoAction();
if (pContext)
{
delete pContext;
pContext = nullptr;
}
return 0;
}