策略模式意图将解决问题的算法分别封装成一个个对象的形式,并使这些算法对象相互间可被替换。模式比较简单,对于策略对象结构的设计,可抽象一个抽象基类,并定义好相关算法(纯)虚接口,并由各种具体的实现算法子类实现即可。因此模式的类关系结构图参考如下:

模式编码结构参考如下:

 namespace strategy
{
class IAbstractStrategy
{
public:
// some code here........
virtual void executeAlgorithm() = ; };//class IAbstractStrategy class ConcreteStrategy1 : public IAbstractStrategy
{
public:
// some code here........
virtual void executeAlgorithm() override {
// some code here........
// execute real algorithm code.
// some code here........
} };//class ConcreteStrategy1 class ConcreteStrategy2 : public IAbstractStrategy
{
public:
// some code here........
virtual void executeAlgorithm() override {
// some code here........
// execute real algorithm code.
// some code here........
} };//class ConcreteStrategy2 class Context
{
public:
// some code here........
void doSomething(IAbstractStrategy* pStrategy) {
// e.g
if (nullptr != pStrategy) {
pStrategy->executeAlgorithm();
}
} }; }//namespace strategy

Strategy模式编码结构参考

策略模式主要是在当一个问题的解存在不止一种方案并且这些解有可能随时被替换相互替换的情况下使用。如游戏中的角色的目标选择方案就可考虑使用策略模式。如游戏中的角色技能也可考虑使用策略模式,同一角色当前正在使用普通技能,过会就可能使用法术技能等等。在这些情况下使用策略模式是挺方便的,比较后期想有了新的具体实现策略时,不需要对应用的逻辑结构进行调整,只需要新扩展一个具体实现策略即可。

在编码实现上,设计人员可能需要考虑数据信息如何传递给对应的策略对象中,此时可能需要视具体的环境而定。一种可参考的方案可将策略所需的数据信息骑过参数形式传入。这种方案对于不同的具体实现策略对象来说,却并不一定全都有用。甚至有时为了某个特别的具体实现策略对象来说,需要的参数很多,于是在抽象类上就将所有参数都列入。可实际上,这些参数中的绝对大多数却有可能对其他的那些具体实现策略来说,是完全没有用的。并且后期如果扩展新的实现策略的话,则有可能会影响整个策略类系的接口重新调整。第二种可参考的方案是直接将上下文对象作为参数传入。该方案对于策略类系来说,结构比较稳定,并且任何一个新的或旧的具体实现策略都可以取到它们自己所需要的数据信息。但是这种情况下,势必要求上下文对象必需开放过多的(甚至是)不必要的接口出来。这样就无形当中破坏了封装性。

【行为型】Strategy模式的更多相关文章

  1. 模板模式与策略模式/template模式与strategy模式/行为型模式

    模板模式 模版模式,又被称为模版方法模式,它可以将工作流程进行封装,并且对外提供了个性化的控制,但主流程外界不能修改,也就是说,模版方法模式中,将工作的主体架构规定好,具体类可以根据自己的需要,各自去 ...

  2. Java设计模式(18)策略模式(Strategy模式)

    Strategy是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类. Stratrgy应用比较广泛,比如,公司经营业务变化图,可能有两种实现方式,一个是线条曲线, ...

  3. Java 实现策略(Strategy)模式

    策略模式:行为型模式 将同一行为,不同的处理算法分别封装起来.让它们之间能够互相替换 1. 定义一个超类型接口,及 行为方法 2. 定义不同的实现类,实现该行为的 不同的算法 /** * 策略模式:针 ...

  4. 敏捷软件开发(4)--- TEMPLATE METHOD & STRATEGY 模式

    1.TEMPLATE METHOD 泛型,也就是这个模式,是可以基于泛型的. 我们往往会有一些算法,比如排序算法.它的算法部分,我可以把它放在一个基类里面,这样具体类型的比较可以放在子类里面. 看如下 ...

  5. Template Method模式和Strategy模式[继承与委托]

    继承 program by difference. 通过继承,可以建立完整的软件结构分层.其中每一层都可以重用该层次以上的Code. 过度使用继承的代价是巨大的.应使用组合或者委托来替代继承. Tem ...

  6. Strategy 模式

    可以看到 Strategy 模式和 Template 模式解决了类似的问题,也正如在 Template 模式中分析的,Strategy模式和 Template 模式实际是实现一个抽象接口的两种方式:继 ...

  7. C++设计模式---Strategy模式

    一.前言 学习的第一个设计模式!不知道理解的对不对,期望大家一起多交流~ Strategy模式:策略模式,定义了算法族,分别封装起来,此模式可以让算法的变化独立于使用算法的客户.Strategy模式将 ...

  8. 设计模式之Singleton模式和Strategy模式是什么

    Singleton模式 单例模式,也交单子模式,有时候系统只需要拥有一个全局对象. 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建.这个类提供了一种访问其唯一的对象的方 ...

  9. 设计模式之——浅谈strategy模式(策略模式)

    strategy模式,即策略模式.个人觉得吧,策略模式更多的是一种思维方式. 首先我们要知道,为什么需要策略模式.举个例子,比如用程序输出今天下午去玩什么. PlayGame 玩游戏 package ...

随机推荐

  1. 10th day

    貌似有几天没写博客了额.... 现在学习MySQL数据库,难度并不是很大,只是需要记忆的知识点比较多,好多语法之类的,比较容易混淆,而且老师讲课的速度还是蛮快的,虽然部分同学觉得听起来有点吃力,不过我 ...

  2. 使用Dreamwaver cc中的SVN功能,用于传输BAE和SAE中的文件

    前沿: 假期使用BAE和SAE开发应用,两个服务器都需要通过SVN提交代码,因为平时大多使用Dreamwaver,所以查了查资料,通过Subversion方便了开发. 因为网上的资料都不全,所以根据自 ...

  3. Codeforces 437B The Child and Set

    题目链接:Codeforces 437B The Child and Set 開始是想到了这样的情况,比方lowbit之后从大到小排序后有这么几个数,200.100,60.50.S = 210.那先选 ...

  4. ie11只能用管理员身份打开解决办法

    解决IE11只能用管理员身份运行的问题 不知道大家有没有遇到这种情况,在毫不知情的情况下 IE11 突然打不开了,必须要用管理员身份运行才可以打开,而且重置浏览器这个方法也不奏效. 今天本人也遇到了, ...

  5. Linux TCP队列相关参数的总结

    作者:阿里技术保障锋寒 原文:https://yq.aliyun.com/articles/4252 摘要: 本文尝试总结TCP队列缓冲相关的内核参数,从协议栈的角度梳理它们,希望可以更容易的理解和记 ...

  6. Win7下Qt5.2中使用OpenGL的glu函数库无法使用的解决方案

          最近在Window7使用Qt5.2学习OpenGL时,出现了以OpenGL中glu开头的函数库无法使用的错误,例如: 'gluPerspective'  was not declared ...

  7. html contenteditable

    contenteditable 是html中的一個屬性,在HTML中,某些元素設置 contenteditable='true'  屬性時可以開啟該元素的編輯模式,contenteditable 可以 ...

  8. 网络环境场景以及模拟工具netem

    网络环境场景包括: 延迟(Lag),把数据包缓存一段时间后再发出,这样能够模拟网络延迟的状况. 掉包(Drop),随机丢弃一些数据. 节流(Throttle),把一小段时间内的数据拦截下来后再在之后的 ...

  9. [转] STL源码学习----lower_bound和upper_bound算法

    http://www.cnblogs.com/cobbliu/archive/2012/05/21/2512249.html PS: lower_bound of value 就是最后一个 < ...

  10. Python | 基础系列 · Python为什么没有switch/case语句?

    与我之前使用的所有语言都不同,Python没有switch/case语句.为了达到这种分支语句的效果,一般方法是使用字典映射: def numbers_to_strings(argument): sw ...