#include <iostream> #include <string> using namespace std; // 策略模式:它定义了算法家族,分别封装起来,让他们之间可以相互替换, // 此模式让算法变化,不会影响到使用算法的客户 // 策略模式就是用来封装算法的,但在实践中,我们发现可以用它来,封装 // 几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的 // 业务规则,就可以考虑使用策略模式处理这种变化的可能性 // 该程序时模拟商场收银的一个简单功能,有普通收费,打折收费,返还收费 // 定义了一个抽象类和三个派生类,并且通过策略类封装了算法的实现,用户 // 看不到真正的算法代码,使耦合度大大降低。 // 抽象类 class CashSuper { public: virtual double AcceptCash(double money) = 0; }; // 普通收费类 class CashNormal : public CashSuper { public: double AcceptCash(double money) { return money; } }; // 打折收费类 class CashDiscount : public CashSuper { public: CashDiscount(double dis):discount(dis){} double AcceptCash(double money) { return money * discount; } double discount; }; // 返还收费类 class CashBack : public CashSuper { public: CashBack(double condition, double returnmoney):MoneyCondition(condition), moneyReturn(returnmoney){} double AcceptCash(double money) { double returnm; if (money > MoneyCondition) { returnm = money - moneyReturn; } return returnm; } double MoneyCondition; double moneyReturn; }; // 策略类 class Strategy { public: Strategy(string str) { if (str == "普通") { cash = new CashNormal(); } else if (str == "打8折") { cash = new CashDiscount(0.8); } else if(str == "返还") { cash = new CashBack(300, 100); } } double GetResult(double mon) { return cash->AcceptCash(mon); } CashSuper *cash; }; void main() { double total; Strategy *str = NULL; str = new Strategy("返还"); total = str->GetResult(500); cout << total << endl; }