一、类图
建议配合举例食用
![](https://img-blog.csdnimg.cn/8672d035d0c64bab934289acddec3a4a.png)
二、组成
1.一个抽象策略接口类,以及多个具体的策略实现类
2.一个类数据成员含有策略类对象,并且在公有函数中调用策略的具体场景类
三、优缺点
优点:将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。
缺点:
1.客户端必须知道所有的策略类才能很好地对不同算法进行使用;
2.如果备选策略过多,那么类的数量将会十分庞大
四、使用举例
假定一个场景,商品在不同的活动中,折扣力度不同,使用策略模式进行折扣力度的替换。
#include<iostream>
using namespace std;
/*
假定一个场景,商品在不同的活动中,折扣力度不同,使用策略模式进行折扣力度的替换
*/
class CashStrategy {
public:
virtual double acceptCash(int price) {
return price; // 默认原价
};
};
class ConcreteStrategy1 :public CashStrategy {
public:
double acceptCash(int price) {
return price * 0.5; // 打5折
}
};
class ConcreteStrategy2 :public CashStrategy {
public:
double acceptCash(int price) {
return price * 0.7; // 打7折
}
};
class ConcreteStrategy3 :public CashStrategy {
public:
double acceptCash(int price) {
return price * 0.9; // 打9折
}
};
class CashContext {
private:
CashStrategy* cs;
public:
CashContext(CashStrategy* _cs) :cs(_cs){}
double getResult(int price) {
return cs->acceptCash(price);
}
};
int main() {
CashStrategy* cs1 = new ConcreteStrategy1();
CashStrategy* cs2 = new ConcreteStrategy2();
CashStrategy* cs3 = new ConcreteStrategy3();
int price = 100;
cout << "原价 = " << price << endl;
CashContext* ct;
ct = new CashContext(cs1);
cout << "活动1价 = " << ct->getResult(100) << endl;
delete cs1; delete ct;
ct = new CashContext(cs2);
cout << "活动2价 = " << ct->getResult(100) << endl;
delete cs2; delete ct;
ct = new CashContext(cs3);
cout << "活动3价 = " << ct->getResult(100) << endl;
delete cs3; delete ct;
return 0;
}
做笔记使用,如果觉得有不足或者错误的地方还请补充或者指正,谢谢!