作用:策略模式定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化不会影响到客户的使用。
策略模式就是用来封装算法的,但是在实践中我们发现,可以用他来封装任何类型的规则,只要在分析过程中听到在不同的时间应用不同的业务规则,就可以考虑使用策略模式来应对这种变化。
这里将算法的抽象接口封装在一个类中(Context),再通过委托的方式将具体的算法实现交给Strategy类
Strategy定义了所支持的算法的公共接口。
ConcreteStrategy定义了具体的实现。
代码实现:
//Strategy.h
#ifndef _STRATEGY_H_
#define _STRATEGY_H_
class Strategy
{
public:
//Strategy();
//~Strategy();
virtual void AlgrithmInterface() = 0;
};
class ConcreteStrategyA :public Strategy
{
public:
//ConcreteStrategyA();
//~ConcreteStrategyA();
virtual void AlgrithmInterface();
};
class ConcreteStrategyB :public Strategy
{
public:
//ConcreteStrategyB();
//~ConcreteStrategyB();
virtual void AlgrithmInterface();
};
class Context
{
public:
Context( Strategy*);
~Context();
void DoEvent();
private:
Strategy* _Strategy;
};
#endif
//Strategy.cpp
#include "stdafx.h"
#include "Strategy.h"
#include <iostream>
using namespace std;
void ConcreteStrategyA ::AlgrithmInterface()
{
cout << "ConcreteStrategyA::AlgrithmInterface()" << endl;
}
void ConcreteStrategyB ::AlgrithmInterface()
{
cout << "ConcreteStrategyB::AlgrithmInterface()" << endl;
}
Context::Context(Strategy * strategy )
{
this->_Strategy = strategy;
}
Context::~Context()
{
delete this->_Strategy;
}
void Context ::DoEvent()
{
_Strategy->AlgrithmInterface();
}
// StrategyMethod.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "Strategy.h"
int _tmain (int argc , _TCHAR * argv [])
{
Strategy* pStrategy = new ConcreteStrategyA();
Context* pContext = new Context(pStrategy);
pContext->DoEvent();
pStrategy = new ConcreteStrategyB();
pContext = new Context(pStrategy);
pContext->DoEvent();
getchar();
return 0;
}