Java设计模式之行为型模式 | 策略模式

37 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 22 天,点击查看活动详情

觉得对你有益的小伙伴记得点个赞+关注

后续完整内容持续更新中

希望一起交流的欢迎发邮件至javalyhn@163.com

1. 策略模式的定义

策略模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。

2. 策略模式的角色定义

- 抽象策略(Strategy)类: 公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。

  • 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。
  • 环境(Context)类:持有一个策略类的引用,最终给客户端调用。

3. 策略模式使用场景

  • 使用策略模式可以避免使用多重条件语句,如 if...else 语句、switch...case 语句
  • 什么是Spring的 InstantiationStrategy
  • 线程池拒绝策略

4. 策略模式的实现

我们给定以下游戏策略场景

image.png

MainTest

public class MainTest {

    public static void main(String[] args) {

        TeamGNR gnr = new TeamGNR();

        gnr.setGameStrategy(new RandomStrategy());
        gnr.startGame();
    }
}

UziStrategy

/**
 * 冲锋向前策略
 */
public class UziStrategy implements GameStrategy{
    @Override
    public void warStrategy() {
        System.out.println("uzi.....");
    }
}

TeamGNR

/**
 * 环境类
 */
public class TeamGNR {

    //抽取游戏策略算法,并进行引用
    private GameStrategy gameStrategy;

    public void setGameStrategy(GameStrategy gameStrategy) {
        this.gameStrategy = gameStrategy;
    }

    public void startGame(){
        System.out.println("游戏开始.....");
        //游戏策略
        gameStrategy.warStrategy();
        System.out.println("win......");
    }
}

SteadyStrategy

/**
 * 稳健运营策略
 */
public class SteadyStrategy implements GameStrategy {
    @Override
    public void warStrategy() {
        System.out.println("各路小心...及时支援...");
    }
}

RandomStrategy

public class RandomStrategy implements GameStrategy{

    @Override
    public void warStrategy() {
        System.out.println("大乱斗...");
    }

}

GameStrategy

/**
 * 游戏策略
 */
public interface GameStrategy {

    //战斗策略
    void warStrategy();

}

5. 总结

策略模式简而言之就是根据所给的不同策略,通过将自己定义的各类实现交给策略实现类来实现。 就是说你想让环境类做什么,告诉他策略就行。由此,大量的ifelse判断和switchcase语句就可以减少很多了。