[设计模式] 策略模式

来源:互联网 发布:天天秒淘宝秒杀助手 编辑:程序博客网 时间:2024/06/07 05:20

定义

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

简单的例子

现在要实现一款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 -20Knife Attack, HP -5Axe Attack, HP -50

小结

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