【Java设计模式】策略设计模式

最近看了一点设计模式,文章例子是来自HeadFirst中的。

我们假设一种场景:在一个游戏中有多种角色,每个角色只能使用一种武器,但是可以切换武器,这个场景需要怎么设计呢?

策略设计模式:它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户端决定(策略)。Strategy模式主要用来平滑地处理算法的切换 。

哇,这个概念真的好长,我一看就头疼。。。

其实我们在做面向接口编程的时候就是用到了策略模式!

UML类图:

【Java设计模式】策略设计模式_第1张图片

每个具体人物继承或者实现了一个抽象类或接口。角色持有一个武器的接口引用,当我们需要给角色换武器的时候,我们只需要给角色里的接口引用传入不同的实现类就行了,而我们的代码并不需要改变。这就是一种把变化的部分和不变的部分分离开的思想。


下面我们来看一下代码的实现:首先我们创建一个角色的抽象类

package design.pattern.strategic;
/**
 * @author Lion
 * @since 2018/4/24 11:58
 * 角色类
 */
public abstract class AbstractCharacter {
    private WeaponBehavior weaponBehavior;

    public void setWeaponBehavior(WeaponBehavior weaponBehavior) {
        this.weaponBehavior = weaponBehavior;
    }

    public WeaponBehavior getWeaponBehavior() {
        return weaponBehavior;
    }

    /**
     * 每种武器有不同的攻击方式
     * */
    abstract void fight();
}

然后创建我们的角色:

King.class

package design.pattern.strategic;

/**
 * @author Lion
 * @since 2018/4/24 12:55
 */
public class King extends AbstractCharacter {

    @Override
    void fight() {
        getWeaponBehavior().userWeapon();
    }

}

Queen.class

package design.pattern.strategic;
/**
 * @author Lion
 * @since 2018/4/24 12:55
 */
public class Queen extends AbstractCharacter {

    @Override
    void fight() {
        getWeaponBehavior().userWeapon();
    }
}

创建我们的武器接口:

package design.pattern.strategic;
/**
 * @author Lion
 * @since 2018/4/24 11:54
 * 武器策略接口
 */
public interface WeaponBehavior {
    /**
     * 使用武器
     * */
    void userWeapon();
}

创建具体的武器对象:

package design.pattern.strategic;
/**
 * @author Lion
 * @since 2018/4/24 12:01
 * 大宝剑策略
 */
public class SwordBehavior implements WeaponBehavior {
    @Override
    public void userWeapon() {
        System.out.println("大宝剑!!!");
    }
}
package design.pattern.strategic;
/**
 * @author Lion
 * @since 2018/4/24 12:01
 * 匕首策略
 */
public class KnifeBehavior implements WeaponBehavior {
    @Override
    public void userWeapon() {
        System.out.println("小匕首。。。");
    }
}

运行一下:

public static void main(String[] args) {
        //王
        King king = new King();
        king.setWeaponBehavior(new SwordBehavior());
        king.fight();
        //后
        Queen queen = new Queen();
        queen.setWeaponBehavior(new KnifeBehavior());
        queen.fight();
 }

由于我们传入的武器对象不一样,所以两个人物的行为不一样。

你可能感兴趣的:(java,java设计模式)