在很多情况下,我们一个对象的同一个方法可能在不同的情况下表现形式不同,例如:我们早上如何去上班这个问题,通常情况下可以选择乘公交、坐地铁。可是在某些情况下(比如脑子一热想健身)我们也可以骑自行车或者跑着去公司,此时虽然我们都是要去公司,但是去公司的方式却不同,在这种情况下我们就可以用到我们的策略模式了。
记住:有一个去公司的方法可能比坐地铁是去公司的方法更好(有一个比是一个可能更好!)。
好了不废话,直接看代码:
//首先我们需要一个去上班方式的基类,并在该类中声明“去上班”的接口函数。
class CGoToWorkWay
{
public:
CGoToWorkWay() = default; //默认构造函数
virtual void run() = 0; //声明为纯虚函数,防止用户直接构造该类。
};
//接下来我们就需要去实现几种去上班的方法了
class CBySubway :public CGoToWorkWay
{
public:
CBySubway() = default;
void run()
{
cout << "bySubWay"<<endl;
}
};
class CByBus :public CGoToWorkWay
{
public:
CByBus() = default;
void run()
{
cout << "ByBus" << endl;
}
};
class CWalk :public CGoToWorkWay
{
public:
CWalk() = default;
void run()
{
cout << "Walk" << endl;
}
};
class CByBike :public CGoToWorkWay
{
public:
CByBike() = default;
void run()
{
cout << "ByBike" << endl;
}
};
//最后我们声明一个Person类,在里面添加去上班的方法,并在该方法中调用上面我们CGoToWorkWay类中的接口函数。
class Person
{
public:
Person(shared_ptr<CGoToWorkWay> pWay):m_cGoToWork(pWay)
{
};
void GoToWork()
{
if (m_cGoToWork)
{
m_cGoToWork->run();
}
}
void ChangeGoWorkWay(shared_ptr<CGoToWorkWay> pWay)
{
m_cGoToWork = pWay;
}
private:
shared_ptr<CGoToWorkWay> m_cGoToWork;
};
//最后我们试验一下
int main()
{
shared_ptr<CGoToWorkWay> way = make_shared<CBySubway>();
Person *p = new Person(way);
p->GoToWork();
way = make_shared<CByBus>();
p->ChangeGoWorkWay(way);
p->GoToWork();
way = make_shared<CWalk>();
p->ChangeGoWorkWay(way);
p->GoToWork();
way = make_shared<CByBike>();
p->ChangeGoWorkWay(way);
p->GoToWork();
return 0;
}
输出结果:
bySubWay
ByBus
Walk
ByBike
设计原则:
1. 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
2. 针对接口编程,而不是针对实现编程。
3. 多用组合,少用继承。