设计模式之策略模式

来源:互联网 发布:gtkwave windows 编辑:程序博客网 时间:2024/06/06 17:51

1、策略模式的定义:定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。


2、示例:游戏角色与武器的功能实现,不同的角色可以使用不同的武器,而且在游戏过程中可以随时切换武器,为了便于扩展,采用策略模式实现。

//角色的超类,所有的角色都继承自此类public class Character{WeaponBehavior mWeaponBehavior;//定义所使用的武器接口对象,每种武器都会引用实现WeaponBehavior接口对象//更多对象    //超类对角色共性的默认实现.......    //打斗的方法public void performFight(){mWeaponBehavior.useWeapon();}    public void setWeaponBehavior(WeaponBehavior weaponBehavior){      this.mWeaponBehavior=weaponBehavior;}    }    //国王角色,继承自超类Characterpublic Class King extends Character{    public King(){//国王使用SwordBehavior类(宝剑)进行打斗,当performFight()被调用时用宝剑攻击对方mWeaponBehavior=new SwordBehavior();        //更多对象    ......}}    //骑士角色,继承自超类Characterpublic Class Knight extends Character{    public Knight(){//骑士使用BowAndArrowBehavior类(弓箭)进行打斗,当performFight()被调用时用弓箭攻击对方    mWeaponBehavior=new BowAndArrowBehavior();        //更多对象    ......}}    //更多种类的角色类实现......        //武器的接口public interface WeaponBehavior{ //定义统一的攻击方法 public void useWeapon();}    //宝剑的实现类public class SwordBehavior implements WeaponBehavior{//实现发声的方法public void useWeapon(){System.out.println("实现用宝剑攻击");}}    //弓箭的实现类public class BowAndArrowBehavior implements WeaponBehavior{//实现发声的方法public void useWeapon(){System.out.println("实现用弓箭攻击");}}    //更多的武器实现类......


3、总结:此例子虽然简单,但是突出了策略模式的精髓:封装了变化的部分(不同的角色可以使用不同的武器),使变化的部分独立于不变的部分;面向接口编程,而非面向实现编程,使代码更有弹性,并且可以通过setter方法在打斗过程中动态的改变角色所使用的武器;利用组合的方式成功的扩展了对象的功能,避免了利用继承带来的代码重写等问题。

    注:此例子模仿深入浅出设计模式一书中关于策略模式的讲解中的例子。






0 0