c++策略模式-商品打折

2024-02-22 20:10
文章标签 c++ 模式 商品 策略 打折

本文主要是介绍c++策略模式-商品打折,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

策略模式:

策略模式(Strategy Pattern)定义一系列算法,把它们一个个封装起来,并且使它们可以互相替换。

我直接把解释写在了代码里面,方便理解

多的不说,直接上车走

下面是main函数

#include <iostream>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include"Goods.h"
using namespace std;int main()
{vector<Goods *>cart;        ///商品容器Dazhe *bazhe=new Dazhe(0.8);///打八折Song *song=new Song(3,1);   ///买3送1Fan *fan=new Fan(50,10);    ///满50送10元cart.push_back(new Goods("铅笔",1,10,song));///商品名,单价,数量,折扣方式cart.push_back(new Goods("本子",2,10,bazhe));cart.push_back(new Goods("订书机",30,3,fan));double total=0;for(int i=0;i<cart.size();i++){Goods *p=cart[i];cout<<*p<<endl;///这里要重载operator<<
//        p->show();total+=p->Caculate();///p->Caculate的返回值是商品最后成交价}cout<<"总价:"<<total<<endl;///商品的总价return 0;
}

物品类:

#ifndef GOODS_H
#define GOODS_H
#include<iostream>
#include<cstring>
using namespace std;class Strategy///把打折和购买商品联系起来,就像一个接口一样
{
public:virtual double Caculate(double price,double number)=0;///这里的虚函数不会被调用,只是要用虚函数引出子类同名虚函数virtual void SHOW(){}
};
class Goods
{friend ostream & operator<<(ostream &o,const Goods &g);///重载<<主要是在主函数输出类对象的时候被调用了
public:Goods(string str,double pp,double nn,Strategy *ss=0);///构造函数virtual ~Goods();double Caculate()const;
protected:Strategy * _s;double price;double number;double sum;string name;
private:
};
#endif

 物品类的实现:

#include "Goods.h"
#include<cstring>
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
using namespace std;Goods::Goods(string str,double pp,double nn,Strategy *ss)///构造函数
{name=str;price=pp;number=nn;_s=ss;sum=ss->Caculate(price,number);///调用子类的虚函数,返回折扣后的总价
}
double Goods::Caculate()const///这个是物品类里面的caculate函数,和折扣类里面的caculate函数不一样
{return sum;
}ostream & operator<<(ostream &o,const Goods &g)///重载<<运算符
{o<<"商品名:"<<g.name<<endl;o<<"单个价格:"<<g.price<<endl;o<<"购买数量:"<<g.number<<endl;g._s->SHOW();o<<"最后成交价为:"<<g.sum<<endl;return o;
}Goods::~Goods()
{//dtor
}

打折类:

class Dazhe:public Strategy///打折
{
private:double k;
public:Dazhe(double ZHE):k(ZHE){}double Caculate(double price,double number){return price*number*k;}void SHOW(){cout<<"恭喜客户参加了我们商店的"<<k<<"折活动"<<endl;}
};
class Song:public Strategy///买够a1件商品送a2件商品
{
private:int a1,a2;
public:Song(int n,int m):a1(n),a2(m){}double Caculate(double price,double number){int k1=number;if(k1>=a1){int k2=k1/a1;k1=k1-k2;}return k1*price;}void SHOW(){cout<<"恭喜客户参加了我们商店的买"<<a1<<"送"<<a2<<"活动"<<endl;}
};
class Fan:public Strategy///满减
{
private:int a1,a2;
public:Fan(int n,int m):a1(n),a2(m){}double Caculate(double price,double number){double k1=price*number;int k2=(int)k1;if(k2>=a1)return k2-a2;}void SHOW(){cout<<"恭喜客户参加我们商店买够"<<a1<<"元就送"<<a2<<"元活动"<<endl;}
};

最后结果:

 

 

这篇关于c++策略模式-商品打折的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/736362

相关文章

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

Deepseek使用指南与提问优化策略方式

《Deepseek使用指南与提问优化策略方式》本文介绍了DeepSeek语义搜索引擎的核心功能、集成方法及优化提问策略,通过自然语言处理和机器学习提供精准搜索结果,适用于智能客服、知识库检索等领域... 目录序言1. DeepSeek 概述2. DeepSeek 的集成与使用2.1 DeepSeek API

Redis的数据过期策略和数据淘汰策略

《Redis的数据过期策略和数据淘汰策略》本文主要介绍了Redis的数据过期策略和数据淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录一、数据过期策略1、惰性删除2、定期删除二、数据淘汰策略1、数据淘汰策略概念2、8种数据淘汰策略

c++中std::placeholders的使用方法

《c++中std::placeholders的使用方法》std::placeholders是C++标准库中的一个工具,用于在函数对象绑定时创建占位符,本文就来详细的介绍一下,具有一定的参考价值,感兴... 目录1. 基本概念2. 使用场景3. 示例示例 1:部分参数绑定示例 2:参数重排序4. 注意事项5.

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

SpringBoot中的404错误:原因、影响及解决策略

《SpringBoot中的404错误:原因、影响及解决策略》本文详细介绍了SpringBoot中404错误的出现原因、影响以及处理策略,404错误常见于URL路径错误、控制器配置问题、静态资源配置错误... 目录Spring Boot中的404错误:原因、影响及处理策略404错误的出现原因1. URL路径错

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表