策略模式(Strategy)

策略模式(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();
    }
}

你可能感兴趣的:(策略模式(Strategy))