首页 > 学院 > 开发设计 > 正文

策略模式

2019-11-08 00:47:12
字体:
来源:转载
供稿:网友

策略模式

策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。

Context(应用场景)

1、需要使用ConcreteStrategy提供的算法 2、内部维护一个Strategy的实例 3、负责动态设置运行时Strategy具体的实现算法 4、负责跟Startegy之间的交互和数据传递

Startegy(抽象策略类)

1、定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现

ConcreteStrategy(具体策略类)

1、实现了Strategy定义的接口,提供具体的算法实现

#include <iostream>#include <cmath>#include <string>using namespace std;class CashSuper{public: virtual double acceptMoney(double money)=0;};class CashNormal : public CashSuper{public: double acceptMoney(double money) { return money; }};class CashRebate : public CashSuper{PRivate: double discount;public: CashRebate(double dis) { discount =dis; } double acceptMoney(double money) { return money*discount; }};class CashReturn : public CashSuper{private: double moneyCondition; double moneyReturn;public: CashReturn(double mc,double mr) { moneyCondition=mc; moneyReturn=mr; } double acceptMoney(double money) { double result=money; if(money>=moneyCondition) { result=money-floor(money/moneyCondition)*moneyReturn; } return result; }};class CashContext{private: CashSuper *cs;public: CashContext(string str) { if(str=="正常消费") { cs=new CashNormal(); } else if (str=="打9折") { cs=new CashRebate(0.9); } else if(str=="满1000送200") { cs=new CashReturn(1000,200); } } double getResult(double money) { return cs->acceptMoney(money); }};int main(){ double money=1000; CashContext *cc=new CashContext("正常收费"); cout<<cc->getResult(money); return 0;}

策略的抽象类,接口,抽象类的指针可以访问所有子类对象(纯虚函数)

实现的各种策略,各种策略的实现类,都必须继承抽象类

策略的设置接口类,设置不同策略


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表