策略模式

策略模式:它定义了算法家族,分别封装起来,让它们之间可以互相替换,但是不会影响到使用算法的客户。策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合,策略模式依赖于多态。
设计步骤:
1. 策略的抽象类(纯虚基类),起到接口的作用,抽象类的指针可以访问所有子对象。
2. 实现各种策略,各种策略的实现类,都必须继承自抽象基类。

3. 策略的设置接口类,设置不同策略。

#include <iostream>
#include <cmath>
#include <string>
using namespace std;
//超市收银台,有正常收费,打折,减满三种策略

class CashSuper//无论哪种策略,都是为了收钱
{
public:
	virtual double acceptMoney(double money) = 0;//每种策略都要实现的函数
};

class CashNormal :public CashSuper
{
public:
	double acceptMoney(double money)//正常收钱
	{
		return money;
	}
};

class CashRebate :public CashSuper //打折
{
private:
	double discount;
public:
	CashRebate(double dis) //折扣
	{
		discount = dis;
	}
	double acceptMoney(double money)//收钱
	{
		return money*discount;//折扣
	}
};


class CashReturn :public CashSuper
{
private:
	double moneyCondition;
	double moneyReturn;
public:
	CashReturn(double mc, double mr)//花多少钱,返回多少钱
	{
		moneyCondition = mc;
		moneyReturn = mr;
	}
	double acceptMoney(double money)//收钱,返款
	{
		double result = money;
		if (money >= moneyCondition)
		{
			result = money - floor(money / moneyCondition)*moneyReturn;
		}
		return result;
	}
};

class  CashContext
{
private:
	CashSuper *cs;
public:
	CashContext(string str)//设置策略
	{
		if (str == "正常收费")
		{
			cs = new CashNormal();
		}
		else if (str == "打9折")
		{
			cs = new CashRebate(0.9);
		}
		else if (str == "满1000送200")
		{
			cs = new CashReturn(1000, 200);
		}
	}
	double getResult(double money)
	{
		return cs->acceptMoney(money);
	}
};


int main()
{
	double money = 1000;
	CashContext *cc = new CashContext("正常收费");
	cout << cc->getResult(money);
	cin.get();
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值