[设计模式] 策略模式

定义

将同类的算法或行为分别封装成独立的类,使它们可以互相替换,让具体行为的变换独立于使用者。
说定义可能有点抽象,来看个例子比较直观。

简单的例子

现在要实现一款RPG游戏:
1. 游戏有多个角色,每个角色都有基本的攻击技能。
2. 设计了多款武器,武器攻击的效果不一。
3. 人设可以设定和更换武器来攻击。

使用策略模式来实现:
1. 定义一个武器接口,各款武器都实现这个接口并定义自己的攻击行为。
2. 定义一个角色的超类,拥有一个武器接口实现类的成员变量,并有设置武器的方法。

这里写图片描述

定义武器攻击行为的接口:

public interface WeaponBehavior {
    public void attack();
}

实现用长剑,匕首和斧头的攻击行为:

public class SwordBehavior implements WeaponBehavior {
    @Override
    public void attack() {
        System.out.println("Sword Attack, HP -20");
    }
}

public class KnifeBehavior implements WeaponBehavior {

    @Override
    public void attack() {
        System.out.println("Knife Attack, HP -5");
    }

}

public class AxeBehavior implements WeaponBehavior {

    @Override
    public void attack() {
        System.out.println("Axe Attack, HP -50");
    }
}

然后定义角色的抽象基类:

public abstract class Character {
    WeaponBehavior mBehavior; //武器行为

    public void performAttack(){
        if(mBehavior != null)
            mBehavior.attack(); //使用设置的武器来实现攻击
        else
            System.out.println("Character doesn't have weapon yet");
    }

    //设置具体的武器
    public void setmBehavior(WeaponBehavior mBehavior) {
        this.mBehavior = mBehavior;
    }
}

先设计2个角色:骑士和国王

public class Knight extends Character {
    public Knight() { //骑士的默认武器是长剑
        setmBehavior(new SwordBehavior());
    }
}

public class King extends Character {
    public King() {
        setmBehavior(new KnifeBehavior()); //国王标配小刀
    }
}

开始攻击(没有敌人,只能攻击空气):

public static void main(String[] args) {
        Character knight = new Knight();
        knight.performAttack(); //骑士先用长剑将空气劈倒

        Character king = new King();
        king.performAttack(); //躲在后面的国王,趁机上前捅了一刀

        king.setmBehavior(new AxeBehavior()); //没捅死,急于抢人头的国王换上骑士递过来的斧头
        king.performAttack(); //一顿怒砍,空气终于死了
    }

本来只有30血的空气君这下被爆了75点血。。。

Sword Attack, HP -20
Knife Attack, HP -5
Axe Attack, HP -50

小结

如上面的简单例子,武器的行为可以自由地在角色间切换,其实现完全独立于角色,如果后面需要加入新的角色和武器,那么目前已经实现的类将不用进行改动。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值