策略模式

本文通过一个商场收银系统的案例,详细介绍了策略模式的应用。通过定义不同的收银策略类,如正常收费、打折和满减等,展示了如何利用面向对象的多态特性实现灵活的策略选择。此外,还提供了完整的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经过一个礼拜的休息,重新开始设计模式的学习。

今天学习的是策略模式,策略模式运用的就是面向对象的”多态思想“,首先定义一个策略基类,并定义所有的子类需要的接口,然后在基类的基础之下定义具体的策略类。

再定义一个上下文(context)类,这个类中只出现策略基类。运用基类的策略基类的指针来指向他的子类,并根据不同策略更改指向的子类。这样就可以选择具体的策略了。

从而实现新增加一种策略后只要在context中增加几行代码就可以运用新增加的策略类中的算法了。

不多说了,上代码:

// StrategyModel.cpp : 定义控制台应用程序的入口点。
//

//策略模式
#include "stdafx.h"
#include <iostream>
using namespace std;


/*
*需求:某商场收银软件,在节假日有各种优惠需
*求,打折需求种类随时间或者是销售策略变化,
*请用面向对象思想设计一个软件。
*/


//收银基类,策略类
class CashSuper
{
public:
	CashSuper(){}
	CashSuper(double Discount):Discount(Discount){}
	virtual double FinalMoney(double Original) = 0;   //定义一个纯虚函数,用来决定往下调用哪个函数
protected:
	double Original;                   //原来的jiage
	double Discount;                   //折扣或者满多少返多少
};

//普通的收银类,即没有任何优惠
class CashNormal:public CashSuper
{
public:
	CashNormal():CashSuper(){}
	virtual double FinalMoney(double Original){return Original;}
};

//打折的收银类,即按某件商品在原价的基础之上打多少折扣
class CashRebate:public CashSuper
{
public:
	CashRebate(double Discount):CashSuper(Discount){}
	virtual double FinalMoney(double Original)
	{
		double temp = Original * Discount; 
		return temp;
	}
};

//返回的收银类,即买完商品总价总计满多少之后减多少
class CashReturn:public CashSuper
{
public:
	CashReturn(double Discount,double DiscountRequire):CashSuper(Discount),DiscountRequire(DiscountRequire){}
	virtual double FinalMoney(double Original)
	{
		if( Original >= DiscountRequire )
			return Original - Discount;
		else
			return Original;
	}
private:
	double DiscountRequire;
};

//上下文类,用来选择哪种类,哪种收款方式
class Context
{
public:
	Context(){}
	Context(int Choice)
	{
		this->Choice = Choice;
		switch(this->Choice)
		{
			case 0:AcceptWay = new  CashNormal(); break;   //正常收费
			case 1:AcceptWay = new CashRebate(0.5);break;    //打5折
			case 2:AcceptWay = new CashReturn(20.0,100);break; //满100减20
			default:break;
		}
	}
	void ReChoicePayWay(int Choice)
	{ 
		this->Choice = Choice; 
		delete AcceptWay;
		switch(this->Choice)
		{
			case 0:AcceptWay = new  CashNormal(); break;   //正常收费
			case 1:AcceptWay = new CashRebate(0.5);break;    //打5折
			case 2:AcceptWay = new CashReturn(20,100.0);break; //满100减20
			default:break;
		}
	}
	double AcceptMoney(double Original){ double temp = AcceptWay->FinalMoney(Original);return temp; }
private:
	CashSuper *AcceptWay;
	int Choice;
};


int _tmain(int argc, _TCHAR* argv[])
{
	cout<<"原价100:100"<<endl;
	Context* accept = new Context(0);   //表示不打折买东西
	double Temp = accept->AcceptMoney(100);
	cout<<"正常收款:"<<Temp<<endl;  //收款100百
	accept->ReChoicePayWay(1);  //表示打5折
	cout<<"打5折收款:"<<accept->AcceptMoney(100)<<endl;
	accept->ReChoicePayWay(2);  //满100减20
	cout<<"满100减20收款:"<<accept->AcceptMoney(100)<<endl;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

南窗客斯黄

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值