Head First 设计模式笔录--策略模式

核心关注点

策略模式对每一种策略都写成一个策略类,这些策略类都共同实现了同一个策略接口。

我们的对象类中依赖该接口,而不依赖具体的策略类,并且,我们的对象类提供了set方式去具体实例化该策略接口,通过set方式,就可以在代码中动态的实例化具体的策略类,已达到根据需求动态调用不同的策略。

ps:

1、符合面向接口编程思想,我们应该面向接口编程,而不是面向具体的对象,所以我们依赖的是接口,而不是具体的对象。

2、符合开放封闭原则,对于日后我们希望增加新的策略,只需要创建一个新的类,并实现策略接口即可。对现有的类完全不需要改动。

关于鸭子的设计故事

背景:产品经理让我们设计一个鸭子类,具备了一些基本特征,但是后面产品经理希望,部分鸭子具备飞行的能力,部分鸭子是不会叫的,比如木鸭子,橡皮鸭。

我们将飞行的能力和叫的能力抽出来,称为2个接口,分别声明了飞行和叫的方法,有具体的类去实现细节。抽象Duck子需要依赖这俩接口,并提供set方法即可。

文中关于鸭子的设计图:

说明: 

抽象基类Duck,依赖了不同的接口,飞行的FlyBehavior 接口和叫的QuackBehavior接口。

这俩接口都拥有各自的实现类。

在Duck中提供了set方法,用来让子类对俩接口具体实例化,同时可以动态设置接口的具体实现。

将部分功能延迟到子类来实现(模板模式)。

如此,基类不需要知道飞行和叫的具体实现细节,这俩实现细节由专门的类去实现,在代码中根据需求,动态设置,如对于后期需要添加新的飞行细节或者呼叫细节,只需要新增加一个飞行的类并implement FlyBehavior接口,不需要改动原来的类。符合开放封闭思想。

缺点:需要实现尽可能考虑到可能需要动态设置的功能,比如后期想增加一个基类没有的功能,就可能需要动到Duck抽象类了。

关于设计谜题,我的实现方案:

题目:有角色Charaactor基类,并且其实现类 Queen 、Knight、King等。

要求每个角色可以持有一把武器,武器接口WeaponBehavior,有具体的武器类,实现了该接口。

要求角色可以动态的切换武器攻击。

核心:

每个角色可以动态的持有不同的武器,武器都具备攻击功能,那么可以写一个武器的接口,声明攻击的方法。

角色同理,每个角色都持有武器,都能战斗,这些都是不变的,变化的是具体的武器类型和攻击方式。

我们可以创建一个抽象角色类,把不变的方法写在抽象类中,变化的可以使用抽象方法让子类具体去实现。同时,我们依赖武器的接口,并提供set方法,用于动态切换武器。

//抽象角色类
abstract class Character {
    protected WeaponBehavior weapon;

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

    public void setWeapon(WeaponBehavior weapon) {
        this.weapon = weapon;
    }
}
class King extends Character {
    public King() {
        System.out.println("我是国王,");
        setWeapon(new AxeBehavior());
    }
}
class Knight extends Character {
    public Knight() {
        System.out.print("我是骑士,");
        setWeapon(new SwordBehavior());
    }
}
//武器接口
interface WeaponBehavior {
    public void useWeapon();
}
class SwordBehavior implements WeaponBehavior {
    @Override
    public void useWeapon() {
        System.out.println("使用宝剑挥舞");
    }
}
class AxeBehavior implements WeaponBehavior{
    @Override
    public void useWeapon() {
        System.out.println("使用·斧头劈砍");
    }
}
//动态创建一个国王,调用国王的战斗方法
Character character = new King();
character.fight();

//国王在机缘之下,获得宝剑
character.setWeapon(new SwordBehavior());
character.fight();

想为国王增加任何武器都可以,角色也可以动态替换成骑士之类的..增加武器不需要修改现有的类。

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值