策略模式定义:
定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
策略模式包含如下角色:
context:环境类
strategy:抽象策略类
concretestrategy: 具体策略类
uml类图:

测试用例
[code]int main(){ //商品费用 double cost; //采取某种收费策略之后的费用 double result; //假如 cost = 1029.88; //声明要使用的具体策略类 //这里显示出了策略类的缺点:客户端必须知道有哪些具体封装的算法。如本例必须知道三种收费方式Normal、Return、Rebate。 StrategyCashSuper *Normal = new ConerectStrategyNormal(cost);//抽象策略类(基类)指针指向派生类->具体策略类(普通收费方式) StrategyCashSuper *Return = new ConerectStrategyReturn(cost); //满300返100收费方式 StrategyCashSuper *Rebate = new ConerectStrategyRebate(cost); //打八折收费 //声明环境类,具体调用的算法,由它来维护 Context *c = new Context(); //设置使用的策略类 c->setStrategy(Normal);//设置为普通收费 //调用算法 result = c->getChargeResult(); std::cout << "Accrued expenses: " << result <setStrategy(Return);//设置为满300返100收费方式 //调用算法 result = c->getChargeResult(); std::cout << "Accrued expenses: " << result <setStrategy(Rebate);//设置为打八折收费 //调用算法 result = c->getChargeResult(); std::cout << "Accrued expenses: " << result << std::endl; return 0;}
头文件Strategy.h
[code]#ifndef _2STRATEGY_H_#define _2STRATEGY_H_//策略类,算法基类class StrategyCashSuper{protected: //商品应付费用,定义为保护成员供子类继承 double cost; public: //构造函数 StrategyCashSuper(double c):cost(c){} //收费结果算法 virtual double ChargeResult();//本想定义为纯虚函数,但不可以。因为虚基类本不能实例化};//正常收费算法class ConerectStrategyNormal: public StrategyCashSuper{public: //构造函数 ConerectStrategyNormal(double c):StrategyCashSuper(c){} //根据本类的收费方式,重写继承的收费算法 double ChargeResult()override;};//满300返100收费算法class ConerectStrategyReturn: public StrategyCashSuper{public: //构造函数 ConerectStrategyReturn(double c):StrategyCashSuper(c){} //重写收费算法 double ChargeResult()override; };//打八折收费算法class ConerectStrategyRebate: public StrategyCashSuper{public: //构造函数 ConerectStrategyRebate(double c):StrategyCashSuper(c){} //重写收费算法 double ChargeResult()override; };//环境类,根据具体算法,维护上下文使用的类class Context{private: //策略基类 StrategyCashSuper *SCS;public: //设置使用的策略 void setStrategy(StrategyCashSuper *s); //具体执行的算法 double getChargeResult();};#endif
实现Strategy.cpp
立即学习“C++免费学习笔记(深入)”;
[code]#include "2Strategy.h"//基类double StrategyCashSuper::ChargeResult(){ return 0;}//正常收费double ConerectStrategyNormal::ChargeResult(){ return cost;}//满300返100收费算法double ConerectStrategyReturn::ChargeResult(){ double res = cost; if(res >= 300) res = cost - 100; return res;}//打八折收费算法double ConerectStrategyRebate::ChargeResult(){ return cost *0.8;}//设置使用的算法void Context::setStrategy(StrategyCashSuper *s){ SCS = s;}//具体执行的算法double Context::getChargeResult(){ return SCS->ChargeResult();}
总结:
策略模式让算法独立于使用它的客户而变化,也成为政策模式。策略模式是一种对象行为型模式。
策略模式包含3个角色:抽象策略类为所支持的算法声明了抽象方法,是所有策略类的父类;具体策略类实现了在抽象策略类中定义的算法。环境类在解决某个问题时可以采用多种策略类(缺点是客户端需要知道所有封装的策略类),在环境类中维护一个对抽象策略类的引用实例。
策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法封装到一系列的策略类里面,作为一个抽象策略类的子类。
策略模式主要优点在于对“开闭原则”的完美支持,在不修改原有系统的基础上可以更换算法或者增加新的算法,它很好的管理算法家族,提高了代码的复用性,是一种替换继承,避免多重条件转移语句的实现方式;其缺点在于客户端必须知道所有的策略类,并理解其区别,同时在一定程度上增加了系统中类的个数,可能会存在很多策略类。
策略模式适用情况包括:在一个系统里面有许多类,它们之间的区别仅在于它们的行为,使用策略模式可以动态地让一个对象在许多行为中选择一种行为;一个系统需要动态地在几种算法中选择一种;避免使用难以维护的多重条件选择语句;希望在具体策略类中封装算法和与之相关的数据结构。
以上就是C++设计模式浅识策略模式的内容,更多相关内容请关注PHP中文网(www.php.cn)!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1431951.html
微信扫一扫
支付宝扫一扫