策略模式中:将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。
//strategy.h
class Strategy{}
public:
Strategy();
virtual ~Strategy()
{
cout<<"straegy"<<endl;
}
virtual void AlgorithmInterface() =0;
;
//ConcreteStrategyA
class ConcreteStrategyA:public Strategy{
public:
ConreteStrategyA();
virtual ~ConcreteStrategyA(){
cout<<"~ConcreteStrategyA"<<endl;
}
void AlgorithmInterface(){
cout<<"AlgoA"<<endl;
}
}
//ConcreteStrategyB
class ConcreteStrategyB:public Strategy{
public:
ConreteStrategyB();
virtual ~ConcreteStrategyB(){
cout<<"~ConcreteStrategyB"<<endl;
}
void AlgorithmInterface(){
cout<<"AlgoB"<<endl;
}
}
//Context
class Context{
public: Context(Strategy *stg):m_stg(stg){}
~Context(){
if(!m_stg)
delete m_stg;
}
void DoAction(){
m_stg->AlgorithmInterface();
}
private:
Strategy *m_stg;
};
//test main
int main(void){
Strategy *ps;
ps = new StrategyA();
Context *pc = new Context(ps);
pc->DoAction();
if(NULL != pc)
delete pc;
return 0;
}
优点
1)“黑盒”复用,因为被包含对象的内部细节对外是不可见的;
2)封装性好,原因为 1);
3)实现和抽象的依赖性很小(组合对象和被组合对象之间的依赖性小);
4)可以在运行期间动态定义实现(通过一个指向相同类型的指针,典型的是抽象基类的指针。
缺点
系统中对象过多。