#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
class Strategy
{
protected:
string name;
public:
explicit Strategy(string str):name(str){}
virtual ~Strategy(){cout<<name<<"Strategy基类析构"<<endl;}
virtual void Do()=0;
};
class StrategyConcreteA:public Strategy
{
public:
StrategyConcreteA(string str):Strategy(str){}
virtual ~StrategyConcreteA(){cout<<name<<" StrategyConcreteA类析构"<<endl;}
virtual void Do(){cout<<name<<" StrategyConcreteA do sth."<<endl;}
};
class StrategyConcreteB:public Strategy
{
public:
StrategyConcreteB(string str):Strategy(str){}
virtual ~StrategyConcreteB(){cout<<name<<" StrategyConcreteB类析构"<<endl;}
virtual void Do(){cout<<name<<" StrategyConcreteB do sth."<<endl;}
};
class Context
{
Strategy* m_Strategy;
public:
Context(Strategy* pStr):m_Strategy(pStr){}
virtual ~Context(){
if(m_Strategy != NULL)
cout<<"Context 析构"<<endl;
delete m_Strategy;
}
void DoAction(){
m_Strategy->Do();
}
};
void Do(Context* pCon)
{
pCon->DoAction();
delete pCon;
}
int main(int argc, char *argv[])
{
cout<<"---------------------------------"<<endl;
Do(new Context(new StrategyConcreteA(string("zxn"))));
cout<<"---------------------------------"<<endl;
Do(new Context(new StrategyConcreteB(string("zmn"))));
cout<<"---------------------------------"<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}