设计模式--策略模式

《Head First 设计模式》中,对于策略模式的描述如下:

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

这里,我们以一个例子来加深对策略模式对理解
任务描述:

将取自一个冒险游戏的一堆杂乱的类与接口,其中包括:游戏角色类、角色可使用的武器行为类;一个角色一次只能使用一把武器,可以更换角色使用对武器。

可选角色:

King(国王)、Queue(皇后)、Troll(巨魔)

可用武器:

sword(剑)、bowAnd Arrow(弓箭)、axe(斧)

根据任务说明,我们可以建立如下的类的关系图:

在这里插入图片描述

根据关系类图,我们可以开始着手进行代码实现:

  1. 角色抽象接口:
public interface ICharactor {
    void fight();
    void setWeaponBehavior(IWeaponBehavior weaponBehavior);
}

其中包含角色所需的基本操作:

  • fight(): 攻击操作
  • setWeaponBehavior:更换武器操作
  1. 角色实现类:
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方法为主类指定一个新的算法即可。

  1. 武器行为接口:
public interface IWeaponBehavior {
    void useWeapon();
}
  1. 武器行为实现类:
public class SwordBehavior implements IWeaponBehavior {
    public void useWeapon() {
        System.out.println("WEAPON_BEHAVIOR: use -SWORD- to fight!\n");
    }
}

具体详情,请见:
https://github.com/yzy199391/HeadFirstDesignPatternPractice

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值