策略模式(Strategy Pattern):定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。(一组相同功能的不同策略,用其中一个就好)
创建表示各种策略的对象和一个行为随着策略对象改变而改变的context对象。
策略对象改变context对象的执行算法。如:旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。
策略模式:
逻辑分析:
多种方案,多种组合方案中选择一种的场景时。
使用场景:
打折策略的选择,多种打折方案只能用一种
算法实现/加密方式策略的选择,多种算法选择,只需要其中一种
如:旅游时出行方案选择其中一种
源码demo:
例如:打折策略的实现:
/******************************************************************************************** 策略模式: 将一系列策略进行封装,客户根据需求去调用相应的策略,实现很方便,后续添加策略时,只需继承接口并实现该策略 1.创建策略类,不同的策略去继承同一个接口函数 2.将策略组成一个算法本 1.持有接口函数的指针,根据条件选择具体的算法,完成策略接口的赋值 2.调用策略执行函数,在执行函数中完成具体的算法,在外界看来调用同一个函数接口可以执行不同的策略 ***********************************************************************************************/ #include<iostream> using namespace std; class Strategy { public: virtual void discount() = 0; }; class five : public Strategy { public: virtual void discount() { cout << "打5折" << endl; } }; class six : public Strategy { public: virtual void discount() { cout << "打6折" << endl; } }; class Context { public: Context(Strategy *strategy) { this->p = strategy; } void Operator() { p->discount(); } private: Strategy *p; }; int main() { Strategy *strategy = new five();//创建具体的算法对象 Context *p = new Context(strategy);//扔向算法目录 p->Operator();//指针指向哪个算法,那么此指针调用的就是谁的算法 delete strategy; delete p; Strategy *strategy1 = new six();//创建具体的算法对象 Context *p1 = new Context(strategy1);//扔向算法目录 p1->Operator();//指针指向哪个算法,那么此指针调用的就是谁的算法 delete strategy1; delete p1; // system("pause"); return 0; }
思考:如何更好得实现策略模式,用策略模式解决更多更好得场景。