https://blog.csdn.net/u013216156/article/details/95775654
https://blog.csdn.net/u012206617/article/details/88369499
策略模式:是指定义一系列的算法,把它们一个个封装起来,并且使它们可以互相替换。使得算法可以独立于使用它的客户而变化,也就是说这些算法所完成的功能是一样的,对外接口是一样的,只是各自实现上存在差异
何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为,比如说A产品类的加法和减法与B产品的加法减法算法不一样。
如何解决:将这些算法封装成一个一个的类,任意地替换。
关键代码:实现同一个接口。
缺点: 1、策略类会增多。
2、所有策略类都需要对外暴露。
策略模式是指定义一系列的算法,把它们单独封装起来,并且使它们可以互相替换,
使得算法可以独立于使用它的客户端而变化,也是说这些算法所完成的功能类型是一样的,
对外接口也是一样的,只是不同的策略为引起环境角色环境角色表现出不同的行为。
相比于使用大量的if...else,使用策略模式可以降低复杂度,使得代码更容易维护。
缺点:可能需要定义大量的策略类,并且这些策略类都要提供给客户端。
[环境角色] 持有一个策略类的引用,最终给客户端调用。
1、不同人吃饭方式的案例
#include "iostream"
#include "string"
using namespace std;
//定义一个含有虚函数的基类
class Strategy
{
public:
virtual void eatFood() = 0;
};
class ChinaEatStrategy : public Strategy
{
void eatFood()
{
cout << "用筷子吃中餐111" << endl;
}
};
class AmericanEatStrategy : public Strategy
{
void eatFood()
{
cout << "用刀叉吃西餐2222" << endl;
}
};
//上下文【这里算法进行归类,对外依然保持一样的接口】
class EatContext
{
private:
Strategy *EatStrategy;
public:
EatContext(string type)
{
if(type == "china")
{
this->EatStrategy = new ChinaEatStrategy();
}
else if(type == "american")
{
this->EatStrategy = new AmericanEatStrategy();
}
}
void eat()
{
EatStrategy->eatFood();
}
};
int main()
{
EatContext *context = new EatContext("china");
context->eat();
context = new EatContext("american");
context->eat();
return 0;
}
2、骑车方式案例
#include <iostream>
class BikeStrategy{
public:
virtual void ride() = 0;
};
class Mobike : public BikeStrategy{
virtual void ride(){
std::cout <<"骑摩拜11"<< std::endl;
}
};
class Haro : public BikeStrategy{
virtual void ride(){
std::cout <<"骑haro单车"<< std::endl;
}
};
class Client{
public:
void setBike(BikeStrategy* bike){
this->bs = bike;
}
void useBike(){
bs->ride();
}
private:
BikeStrategy* bs;
};
int main(){
Client* c = new Client;
Mobike* m = new Mobike;
Haro* h = new Haro;
c->setBike(m);
c->useBike();
c->setBike(h);
c->useBike();
return 0;
}