您的位置:首页 > 理论基础 > 计算机网络

设计模式(2)(策略模式Strategy)

2012-03-06 21:58 155 查看
策略模式(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策略模式就完了。以上是参考书籍和网络上总结而来,欢迎批评指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息