策略模式:
策略模式(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送1
Fan *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;
}
};
最后结果: