策略模式(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策略模式就完了。以上是参考书籍和网络上总结而来,欢迎批评指正。