C++ 策略模式的实现

一、类图

建议配合举例食用

策略模式类图

 

二、组成

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;
}

做笔记使用,如果觉得有不足或者错误的地方还请补充或者指正,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦想是优秀社畜

您的打赏是对我最大的鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值