《Head First 设计模式》
中,对于策略模式的描述如下:
定义算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
这里,我们以一个例子来加深对策略模式对理解
任务描述:
将取自一个冒险游戏的一堆杂乱的类与接口,其中包括:游戏角色类、角色可使用的武器行为类;一个角色一次只能使用一把武器,可以更换角色使用对武器。
可选角色:
King(国王)、Queue(皇后)、Troll(巨魔)
可用武器:
sword(剑)、bowAnd Arrow(弓箭)、axe(斧)
根据任务说明,我们可以建立如下的类的关系图:
根据关系类图,我们可以开始着手进行代码实现:
- 角色抽象接口:
public interface ICharactor {
void fight();
void setWeaponBehavior(IWeaponBehavior weaponBehavior);
}
其中包含角色所需的基本操作:
- fight(): 攻击操作
- setWeaponBehavior:更换武器操作
- 角色实现类:
public class King implements ICharactor {
IWeaponBehavior weaponBehavior = new SwordBehavior();
public void fight() {
this.weaponBehavior.useWeapon();
}
public void setWeaponBehavior(IWeaponBehavior weaponBehavior){
this.weaponBehavior = weaponBehavior;
}
}
此处以国王角色进行说明,所有的角色类中都引入了一个武器行为接口;此处默认为国王
分配剑
作为武器,但是通过setWeaponBehavior方法可以为国王更换任意类型的武器行为。
这就是使用组合而非继承带给程序的灵活性。此外,将武器行为(算法)封装为单独的一系列类并暴露为一个接口,通过组合方式将角色(主类)与武器行为(算法类)关联起来,从而使得算法的变化独立于客户,需要替换算法无需修改主类内容,只需要调用set方法为主类指定一个新的算法即可。
- 武器行为接口:
public interface IWeaponBehavior {
void useWeapon();
}
- 武器行为实现类:
public class SwordBehavior implements IWeaponBehavior {
public void useWeapon() {
System.out.println("WEAPON_BEHAVIOR: use -SWORD- to fight!\n");
}
}
具体详情,请见:
https://github.com/yzy199391/HeadFirstDesignPatternPractice