C++重写《大话设计模式》中模式实例四(策略模式)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34784043/article/details/82933640

(声明:如果想看实例详细解析,请看《大话设计模式》,这里文章只是为了加深学习设计模式印象而自己用C++程序写一遍,以及把代码共享给大家。仅仅是把C#语言换成C++表述,不对书中的程序和例子是否合适做个人表述。)

其实策略模式和简单工厂模式十分相似,一个很明显的不同是把初始化类的“判断”放在了客户端,这样的话,增加某一个策略子类的时候,只需要修改客户端就可以,不需要修改其他类。但是,它缺点是把更多的类和细节暴露给了客户端。

可以参考我简单工厂模式文章:https://blog.csdn.net/qq_34784043/article/details/82925158

UML图:

CashSuper.h

#pragma once
#include <iostream>

//现金收费抽象类
class CashSuper {
public:
    virtual CashSuper(){}
	virtual double acceptCash(double money) = 0;
};

//正常收费子类
class CashNormal :public CashSuper {
public:
    virtual ~CashNormal(){}
	virtual double acceptCash(double money) {
		return money;
	}
};

//打折收费子类
class CashRebate :public CashSuper {
private:
	double moneyRebate;
public:
    virtual ~CashRebate(){}
	CashRebate(double moneyRebate) {
		this->moneyRebate = moneyRebate;
	}
	virtual double acceptCash(double money) {
		return money;
	}
};

//返利收费子类
class CashReturn :public CashSuper {
private:
	double moneyCondition;
	double moneyReturn;
public:
    virtual ~CashReturn(){}
	CashReturn(double moneyCondition, double moneyReturn) {
		this->moneyCondition = moneyCondition;
		this->moneyReturn = moneyReturn;
	}
	virtual double acceptCash(double money) {
		double result = money;
		if (money >= moneyCondition) {
			result = money - int(money / moneyCondition)*moneyReturn;
		}
		return result;
	}
};

CashContent.h:

#pragma once
#include "CashSuper.h"

class CashContext {
private:
	CashSuper *cs;
public:
	//传入具体收费策略
	CashContext(CashSuper *csuper) {
		cs = csuper;
	}
	~CashContext() { delete cs; }
	//获得计算结果
	double GetResult(double money) {
		return cs->acceptCash(money);
	}
};

main.cpp:

#include "CashContext.h"
#include <cstdlib>

int main() {
	double total = 0;//用于总计
	CashContext *cc = NULL;
	enum  Stragy { 正常收费, 满300返100, 打8折 }stragy;
	stragy = 满300返100;
	char* str = "";
	switch (stragy)//选择对应策略
	{
	case 正常收费:
		str = "正常收费";
		cc = new CashContext(new CashNormal);
		break;
	case 满300返100:
		str = "满300返100";
		cc = new CashContext(new CashReturn(300, 100));
		break;
	case 打8折:
		str = "打8折";
		cc = new CashContext(new CashRebate(0.8));
		break;
	default:
		break;
	}
	double totalPrices = 0;
	double Price = 500;//商品价格
	int count = 2;//商品数量
	totalPrices = cc->GetResult(Price*count);//原价格500
	total = total + totalPrices;
	std::cout << "单价:" << Price << " 数量:" << count << " " << str << " 合计:" << totalPrices << std::endl;

    delete cc;
	system("pause");
	return 0;
}

 运行结果:

猜你喜欢

转载自blog.csdn.net/qq_34784043/article/details/82933640
今日推荐