版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}
运行结果: