阅读 14

《Head First 设计模式》笔记-策略模式

欢迎关注我的公众号:月光自习室

1.定义

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

2.例子

考虑这样一个场景,在动作冒险游戏中,不同游戏角色可以使用不同武器,游戏过程中可以更换武器。

可以将武器行为封装起来,建立一个 WeaponBehavior 接口。

public interface WeaponBehavior {
    public void useWeapon();
}
复制代码

不同的武器行为可以实现该接口以到达自己想要的效果。

public class KnifeBehavior implements WeaponBehavior {
    @Override
    public void useWeapon() {
        System.out.println("匕首刺杀: duo duo duo");
    }
}

public class BowAndArrowBehavior implements WeaponBehavior {
    @Override
    public void useWeapon() {
        System.out.println("弓箭射击: biu biu biu");
    }
}

public class AxeBehavior implements WeaponBehavior {
    @Override
    public void useWeapon() {
        System.out.println("斧头劈砍: bang bang bang");
    }
}
复制代码

然后就可以设计角色类,它有一个武器行为,并且可以改变。

public class Character {
    private WeaponBehavior weaponBehavior;

    public Character(WeaponBehavior weaponBehavior) {
        this.weaponBehavior = weaponBehavior;
    }

    public void fight() {
        weaponBehavior.useWeapon();
    }

    public void setWeaponBehavior(WeaponBehavior weaponBehavior) {
        this.weaponBehavior = weaponBehavior;
    }
}
复制代码

这样就完成了一个简单的策略模式,使用一下看看。

Character warrior = new Character(new KnifeBehavior());
warrior.fight();
warrior.setWeaponBehavior(new AxeBehavior());
warrior.fight();
warrior.setWeaponBehavior(new BowAndArrowBehavior());
warrior.fight();
复制代码

这样就可以将经常需要变动的武器行为类和不频繁变化角色类独立起来,扩展武器行为并不会影响到角色。

3.设计原则

  • 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
  • 针对接口编程,而不是针对实现编程
  • 多用组合,少用继承
关注下面的标签,发现更多相似文章
评论