设计模式(2)(策略模式Strategy)
来源:互联网 发布:北京农大动物医院知乎 编辑:程序博客网 时间:2024/06/06 13:12
策略模式(Strategy)
1.网络上的一句话说明
跟不同类型的MM约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,单目的都是为了得到MM的芳心。
2.定义
策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
3.设计原则
① 找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起
② 针对接口编程,而不是针对实现编程
针对接口编程的真正意思是针对超类型编程
③ 多用组合,少用继承
使用组合的系统有很大的弹性,便于修改和扩展和代码复用的目的。
4.举例说明
假设我们在制作一个动作冒险游戏有骑士和妖怪(以后可能还会有其他)实现他们的攻击
很自然我们会抽象一个角色类出来 在角色类上定义fight()方法 2个子类分别继承它
如果这个时候多出了一个公主 她不会攻击 怎么办?
只有在她类中覆盖fight方法 使其什么都不做。如果游戏后续又会多很多很多角色呢 这种情况下的检查成本和出错概率就会很大
或许我们还会想到用接口的方式只有会攻击的才实现攻击接口 如下图
这会造成很多的重复代码。而且如果这个时候又有新的需求 每个战斗角色可以在游戏中拾取武器从而改变攻击方式。
这个时候我们就得重构代码了 或许说应该重写代码了。
运用策略模式的时候就到了
我们把攻击行为抽象成一个接口 命名为Weapon 由具体类实现这个接口 并分别实现自己的攻击方式
比如有宝剑-Sword 弓箭-BowAndArrow 匕首-Knife 斧头-Axe
再让角色类对Weapon有has-a(有一个)的关系 形成一个组合方式 (多用组合,少用继承设计原则)
调用角色类的fight()时候 到武器具体类去实现(利用java多态特性)
如下图:
character源代码
/*** * 角色类 * @author icetiger * * */public class Character {/**武器*/ Weapon weapon; public void setWeapon(Weapon weapon) { this.weapon=weapon; } public void fight() { weapon.useWeapon(); }}
OK策略模式就完了。以上是参考书籍和网络上总结而来,欢迎批评指正。
- 设计模式----策略模式(Strategy)
- 设计模式--策略模式(Strategy)
- 设计模式C++(Strategy策略模式)
- 设计模式---策略模式(strategy)
- java 设计模式--策略模式(strategy)
- 【设计模式】之策略模式(Strategy)
- 设计模式之--策略模式(Strategy)
- 设计模式C++(Strategy策略模式)
- 设计模式(一)Strategy - 策略模式
- 设计模式之策略(strategy)模式
- 设计模式之策略模式(Strategy)
- 设计模式5--策略模式(Strategy)
- 设计模式-----策略模式(strategy)
- 浅学设计模式--策略(Strategy)模式
- PHP 设计模式 策略模式(Strategy)
- 设计模式-策略模式(Strategy)
- Java设计模式----策略模式(Strategy)
- 设计模式之策略模式(Strategy)
- 寒假总结和新学期计划
- Mark一下,android vold分析
- C语言中的文件输入输出函数
- 从文件中获取字段定义的数据和字符串函数
- 环境变量的删除与替换
- 设计模式(2)(策略模式Strategy)
- Android 日历提供器(一)
- iOS SEL类型
- 今天被人试图欺骗,真替他伤心
- 黑马程序员——张孝祥老师7k面试题之交通灯
- Windows下安装AMP(Apache+MySQL+PHP)
- java
- 写txt 文件
- Android中startActivityForResult()的用法