策略模式(Strategy Pattern):定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。策略模式是一种对象行为型模式。

在策略模式结构图中包含如下几个角色:

Context(环境类):环境类是使用算法的角色,在环境类中维持一个对抽象策略类的引用实例,用于定义所采用的策略,实际上环境类将调用策略类中实现算法的方法。环境类针对抽象策略进行编程,无需知道具体是哪一种策略,只要该策略类中实现了具体的算法方法就可以。在同一时刻,环境类只能使用一种策略,而不能使用多种。

Strategy(抽象策略类):它为所支持的算法声明了抽象方法,是所有策略类的父类,它可以是抽象类或具体类,也可以是接口。环境类通过抽象策略类中声明的方法在运行时调用具体策略类中实现的算法。

ConcreteStrategy(具体策略类):它实现了在抽象策略类中声明的算法,在运行时,具体策略类将覆盖在环境类中定义的抽象策略类对象,使用一种具体的算法实现某个业务处理。

策略模式是一个比较容易理解和使用的设计模式,策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法封装到一系列具体策略类里面,作为抽象策略类的子类。在策略模式中,对环境类和抽象策略类的理解非常重要,环境类是需要使用算法的类。

游戏武器系统的设计与实现

伪代码

////////////环境类///////////////////////class 玩家{武器 _weapon;设置武器(weapon){_weapon = weapon;}射击(){_weapon->射击();};
}////////////策略类///////////////////////class 武器{射击();
}class M4A1-翔龙: 武器{射击(){printf("翔龙射击");};
}class AT15-沙丘: 武器{射击(){printf("沙丘射击");};
}class KAC锯式机枪: 武器{射击(){printf("机枪扫射");};
}////////////客户端///////////////////////...
玩家 player = new 玩家();
武器 weapon = new KAC锯式机枪();
player->设置武器(weapon);
...
player->射击();
...

应用场景以及优缺点

1)应用场景

只要涉及到算法的封装、复用和切换都可以考虑使用策略模式。

2)优点

采用该模式可以方便地更换算法或者增加新的算法。避免了较难维护的多重选择条件选择语句。

3)缺点
缺点1:客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法。
解决方案:搭配简单工厂模式

缺点2:客户端一次只能使用一个策略类,也就是说每个具体策略间相互独立。
解决方案:装饰模式(待实践)。

参考此链接

策略模式具体应用

(1)电影院打折算法,成年人全票、VIP6折、儿童票与学生票0.5折优惠。

(2)数据导出:可以导出到数据库、也可以导出到Xml,或者文本文件中。比如:系统异常信息Log,可以记录到数据库也可以记录到文件中。再如:网页上的信息可以转为Word格式保存,也可以转为PDF格式保存。

(3)网络购物,可以选择货到付款、也可以选择U盾支付、还可以选择支付宝支付等支付方式。

(4)对于加密软件的开发,可以选择不同类型的加密算法,肯定不会只有一种加密算法。同样遍历二叉树,存在先序遍历。中序遍历、后序遍历、层序遍历等四种遍历算法,根据需要选择具体的某种遍历算法。还有数据结构中的各种排序算法,根据具体情况选择某个排序算法。

(5)QQ空间背景风格,可以根据需要选择某种喜欢的风格,用来装扮空间。

(6)UI容器管理器,用于管理各种类型控件布局方式。存在多种不同的布局方式,根据美观程度,选择某种布局方式。

策略模式的应用——游戏中武器的选择相关推荐

  1. 设计模式 策略模式 以角色游戏为背景

    今天不想写代码,给大家带来一篇设计模式的文章,帮助大家可以把系统组织成容易了解.容易维护.具有弹性的架构. 先来看看策略模式的定义: 策略模式(Strategy Pattern):定义了算法族,分别封 ...

  2. 设计模式-状态模式-以射击游戏的武器状态为例

    超级链接: Java常用设计模式的实例学习系列-绪论 参考:<HeadFirst设计模式> 1.关于状态模式 命令模式是一种行为型模式. 命令模式:允许一个对象在其内部状态改变时改变它的行 ...

  3. [设计模式] ------ 策略模式实战:java中替代if-else的大段逻辑

    java中用策略模式替代if-else的大段逻辑 问题: java本来是一门以面向对象为主的语言,但很多人嘴上说着java面向对象,然后除了表映射实体之外,其他的还是面向过程的思路. 就比如今天要说的 ...

  4. 策略模式在公司项目中的运用实践,看完又可以涨一波实战经验了!

    营销系统是一个动态的.有机地结合的系统,经常会随着业务的不断变化发生调整,因此从事这一业务的开发可让我头疼了. 之前在工作中就不乏一次遇到过随意调整营销策略的情况,在部分场景下由于使用了硬编码的方式来 ...

  5. 状态模式设计程序:游戏中英雄根据不同的体力值可以进行休息、防御、普通攻击、技能攻击。

    资源下载地址:https://download.csdn.net/download/sheziqiong/85639034 一.应用场景与案例描述 我们经常在课余时间玩游戏以放松身心,缓解压力.在很多 ...

  6. 策略模式在jdk Arrays 中使用

  7. 手机游戏中图片格式选择整理

    整理自: http://zengrong.net/post/2070.htm http://blog.csdn.net/langresser_king/article/details/8426708 ...

  8. [策略模式]在游戏开发中的应用

    设计模式中的每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心.这样,你就能一次又一次地使用该方案而不必做重复劳动. 设计模式在类间关系这个粒度上给出常见问题的解决方案.属于 ...

  9. android策略模式_Android游戏开发–设计游戏实体–策略模式

    android策略模式 在这一部分中,我将尝试解释我对好的游戏设计元素的理解. 我将在示例中使用droid,并编写基本的战斗模拟器脚本以查看其行为. 问题: 我指挥一个机器人,我想消灭敌人. 再次面对 ...

最新文章

  1. nodejs(log4js)服务中应用splunk进行Log存储、搜索、分析、监控、警告
  2. Android安全教程(2)---Fiddler简易使用教程之使用
  3. C# 文件流操作 之 删除、复制、转移多个文件
  4. 合理设置域名TTL值给网站加速
  5. 北京ICP经营许可证备案申请流程 电信业务经营许可办理
  6. 一文搞懂 Flink 的 Exactly Once 和 At Least Once
  7. pooling层如何反向传播? 很简单
  8. 侧滑面板(对viewGroup的自定义)
  9. 小程序快速入门:wxss的使用
  10. H5页面使用js生成二维码
  11. Linux的oracle账户解锁,如何解锁Oracle数据库中账号
  12. 电动自行车CE认证、电动滑板车CE认证审核新标准解析
  13. [个人笔记] ssh-keygen和openssl工具的使用
  14. 7-过零检测算法分析信号周期(app-designer
  15. EV3文件打不开,闪退怎么办(完美解决,无弹窗,无警告)
  16. 主引导扇区及主引导记录MBR的详细说明
  17. 电容电阻尺寸单位规格-小记
  18. trim()方法的使用
  19. 华硕服务器系统都还原不了,windows10系统还原失败怎么办|windows10系统还原失败如何解决...
  20. Mac如何通过 Multi-Touch Bar使用“切换控制”

热门文章

  1. ssh反向代理、动态代理、本地代理
  2. 客户服务器应用虚拟化,应用虚拟化
  3. 弃我去者,昨日之日不可留
  4. PAT(Basic Level) 1096 大美数
  5. 【ArcGIS二次开发】鹰眼的实现
  6. 全局配置文件之settings [运行时行为设置]
  7. ArcGIS二次开发——Arcpy批量自动化发布地图服务
  8. android 双卡 双待机型适配
  9. 作为一名Java程序员,我为何不在生产项目中转向Go?
  10. 三星性能测试软件,三星Exynos 980 PK 骁龙765,基准测试软件中的跑分对比