定义了算法家属,离别封装起来,让他们之间能够相互替代,此形式让算法的变化,不会影响到运用算法的客户。
战略形式包含以下角色:
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 << std::endl; c->setStrategy(Return);//设置为满300返100收费体式格局 //挪用算法 result = c->getChargeResult(); std::cout << "Accrued expenses: " << result << std::endl; c->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
[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++设想形式浅识战略形式的内容,更多相干内容请关注ki4网(www.ki4.cn)!