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

相关文章

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示

C++/类与对象/默认成员函数@构造函数的用法

《C++/类与对象/默认成员函数@构造函数的用法》:本文主要介绍C++/类与对象/默认成员函数@构造函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录名词概念默认成员函数构造函数概念函数特征显示构造函数隐式构造函数总结名词概念默认构造函数:不用传参就可以