本文主要是介绍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++策略模式-商品打折的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!