设计模式(C)-行为型模式-策略模式一、策略模式概述策略模式是一种行为型设计模式它定义了一系列算法将每一个算法封装起来并且使他们可以相互替换。策略模式让算法的变化独立于使用算法的客户端使得算法可以在不修改客户端代码的情况下被灵活地选择和切换。它的核心思想是分离“做什么”策略和“谁来做/在什么环境下做”上下文二、策略模式UML类图策略模式场景假如现在有个英雄需要使用武器对付敌人武器有两种匕首和AK那么选择使用哪种武器其实就是一种策略可以将策略模式分为三部分Strategy 策略基类抽象武器ConcreteStrategy 具体策略(使用匕首或AK)Context 具体使用策略的对象英雄具体UML类图如下三、策略模式代码实现//strategy.h#pragmaonce/*Strategy 模式和 Template 模式要解决的问题是相同类似的都是为了给业务逻辑算法具体实现和抽象接口之间的解耦 简而言之,Strategy 模式是对算法的封装。处理一个问题的时候可能有多种算法,这些算法的接口(输入参数,输出参数等)都是一致的, 那么可以考虑采用Strategy 模式对这些算法进行封装,在基类中定义一个函数接口就可以了。 *//*假如现在有个英雄需要使用武器对付敌人武器有两种匕首和AK那么这么选择使用哪吧武器其实就是一种策略了那么就可以将策略模式分为三部分 Strategy 策略基类 抽象武器 ConcreteStrategy 具体策略 使用匕首或AK Context 具体使用策略的对象英雄*/#includeiostreamusingnamespacestd;//抽象武器 策略基类抽象的策略classWeaponStrategy{public:virtualvoidUseWeapon()0;};//具体的策略使用匕首做武器classKnife:publicWeaponStrategy{public:virtualvoidUseWeapon(){cout使用匕首endl;}};//具体的策略 使用AK47做武器classAK47:publicWeaponStrategy{public:virtualvoidUseWeapon(){cout使用AK47endl;}};//具体使用策略的角色classContext{public:voidsetWeapon(WeaponStrategy*pWeapon){this-pWeaponpWeapon;}voidThrowWeapon(){this-pWeapon-UseWeapon();}private:WeaponStrategy*pWeaponnullptr;};voidtestStrategy();//strategy.cc#includestrategy.hvoidtestStrategy(){coutstrategy startendl;Context*characternewContext;WeaponStrategy*knifenewKnife;WeaponStrategy*ak47newAK47;//用匕首当作武器character-setWeapon(knife);character-ThrowWeapon();//用AK47当作武器character-setWeapon(ak47);character-ThrowWeapon();deleteak47;ak47nullptr;deleteknife;knifenullptr;deletecharacter;characternullptr;coutstrategy endendl;}四、优缺点总结优点开闭原则无需修改上下文就能轻松引入新的武器只需新增一个具体策略类消除条件判断赏析文中没有任何关于具体的if-else语句代码更简洁算法服用策略对象可以在系统的不同部分共享使用运行时灵活客户端可在运行时动态地为上下文选择并切换算法职责清晰策略类只关心如何实现特定的算法上下文类只关心如何调度和使用策略不关心其实现细节。缺点类数量增加每个具体的策略都是一个类如果算法很简单且数量多会知道系统类文件操作。客户端必须了解策略客户端要知道不同策略的区别以便选择合适的策略设置。通信开销策略接口可能强迫某些策略实现他么不需要的方法。