现实需求:实现某种目标存在多种策略可供选择的情况,例如出行旅游可以乘坐飞机、乘坐火车、骑自行车或自己开私家车等,超市促销可以釆用打折、送商品、送积分等方法。
策略模式:定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。
优点:
缺点:
主要角色:
具体案例:
这不马上五一快到了吗?小码路和哥哥,姐姐分开出去旅游,分别选择不同的出行方式。
第一步:抽象策略类
#pragma once
#include <iostream>
using namespace std;
class Way
{
public:
virtual void TrafficWay()=0;
virtual ~Way(){};
};
第二步:具体策略类
class ByCar:public Way
{
public:
void TrafficWay()
{
cout<<"自驾车旅游"<<endl;
}
};
class ByHighWay:public Way
{
public:
void TrafficWay()
{
cout<<"乘高铁旅游"<<endl;
}
};
class ByBus:public Way
{
public:
void TrafficWay()
{
cout<<"乘公共汽车旅游"<<endl;
}
};
第三步:不同环境不同策略
#include "ce.h"
#include <memory>
class Travel {
public:
Travel(Way *way);
void performWay();
private:
std::unique_ptr<Way> way_;
};
class GegeTravel : public Travel {
public:
GegeTravel(Way *way);
};
class DidiTravel : public Travel {
public:
DidiTravel(Way *way);
};
class WoTravel : public Travel {
public:
WoTravel(Way *way);
};
Travel::Travel(Way *way)
:way_(way)
{}
void Travel::performWay()
{
way_->TrafficWay();
}
GegeTravel::GegeTravel(Way *way)
:Travel(way)
{
cout<<"我是哥哥"<<endl;
}
DidiTravel::DidiTravel(Way *way)
:Travel(way)
{
cout<<"我是弟弟"<<endl;
}
WoTravel::WoTravel(Way *way)
:Travel(way)
{
cout<<"我是小码路"<<endl;
}
第四步:客户端
int main()
{
Way *bycar = new ByCar();
Way *byhighway = new ByHighWay();
Way *bybus = new ByBus();
Travel *travel = new GegeTravel(bycar);
travel->performWay();
Travel *travel1 = new DidiTravel(byhighway);
travel1->performWay();
Travel *travel2 = new WoTravel(bybus);
travel2->performWay();
}
结果显示:
补充模板实现:
template<typename T>
class Travel
{
public:
Travel(){}
void SelectWay()
{
way.TrafficWay();
}
private:
T way;
};
int main()
{
Travel<ByCar> way_;
way_.SelectWay();
Travel<ByHighWay> way_1;
way_1.SelectWay();
Travel<ByBus> way_2;
way_2.SelectWay();
return 0;
}