策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。
Fate中不同的阶职擅长(默认)使用不同的武器,也可以在战斗中根据环境使用别不同的武器(不同的策略)。
首先定义武器的接口
/**
* 武器概念接口
*/
public interface WeaponBehavior {
void useWeapon();
}
实现武器接口,定义的具体武器
// 匕首
public class KnifeBehavior implements WeaponBehavior {
@Override
public void useWeapon() {
System.out.println("使用匕首。。。");
}
}
// 弓箭
public class BowAanArrowBehavior implements WeaponBehavior {
@Override
public void useWeapon() {
System.out.println("使用弓箭。。。");
}
}
从者概念接口
/**
* 从者
*/
public abstract class Servant {
// 1. 将武器(策略)接口作为属性
protected WeaponBehavior weaponBehavior;
// 2. 改变武器(策略)的功能
public void setWeapon(WeaponBehavior w) {
weaponBehavior = w;
}
public void performWeapon() {
// do something...
weaponBehavior.useWeapon();
// do something..
}
public abstract void fight();
}
实现从者接口,定义从者具体阶职
/**
* 刺客
*/
public class Assassin extends Servant {
public Assassin() {
// 指定 Assassin阶职默认的武器 为匕首
weaponBehavior = new KnifeBehavior();
}
@Override
public void fight() {
System.out.println("Assassin 的武器是匕首");
}
}
/**
* 弓兵
*
*/
public class Archer extends Servant{
public Archer() {
// 指定 Archer阶职默认的武器 为弓箭
weaponBehavior = new BowAanArrowBehavior();
}
@Override
public void fight() {
System.out.println("Archer 使用弓箭战斗");
}
}
测试类
package strategy;
import org.junit.Test;
public class TestMain {
@Test
public void test01() {
// 召唤 Archer阶职 的从者
Servant archer = new Archer();
// Archer 默认的武器策略
archer.performWeapon();
// 运行时动态的改变 Archer 的武器策略
archer.setWeapon(new KnifeBehavior());
archer.performWeapon();
}
@Test
public void test02() {
// 召唤 Assassin阶职 的从者
Servant assassin = new Assassin();
// Assassin 默认的武器策略
assassin.performWeapon();
// 运行时动态的改变 Assassin 的武器策略
assassin.setWeapon(new BowAanArrowBehavior());
assassin.performWeapon();
}
}
网友评论