设计模式之策略模式

概述

策略模式(Strategy Pattern)的思想是在程序运行时动态改变某一个类的执行逻辑,属于一种行为型设计模式。目的是为了尽可能的减少if...else代码。它的核心在于”选择“两个字,每一种选择就是一个策略。通常情况下,在选择不多的时候,我们采用的是if...else代码块来实现。但是这种方式的扩展性不强,每次增加一种选择就需要修改该if...else的源码,违反了开闭原则。况且一旦if...else多了起来可读性也会变差。所以在开发中遇到”多种选择“时,可以优先考虑一下策略模式。

使用场景

  1. 如:中午吃什么?米饭,面,粉等等,每一个选择就是一种策略
  2. 旅游出行时,选择什么样的交通工具。飞机、高铁、地铁

如何实现

  1. 所有的策略实现类有一个顶层接口Strategy,接口中定义了一个执行逻辑方法
  2. 策略实现类实现Strategy接口,编写自己的执行逻辑
  3. 维护一个Context类,这个类的执行逻辑是可变的,每当它的策略发生改变时,其运行结果也会发生改变

代码示例

策略接口及实现类

public interface TravelStrategy {
    String doOperation();
}
public class Airplane implements TravelStrategy {
    @Override
    public String doOperation() {
        return "飞机";
    }
}
public class HighSpeedRail implements TravelStrategy {
    @Override
    public String doOperation() {
        return "高铁";
    }
}
public class Subway implements TravelStrategy {
    @Override
    public String doOperation() {
        return "地铁";
    }
}

可动态改变执行策略的类

public class MyTravelContext {
    public String executeStrategy(TravelStrategy travelStrategy) {
        return "出门旅游坐啥好: " + travelStrategy.doOperation();
    }
}

测试

public class TestStrategy {
    public static void main(String[] args) {
        MyTravelContext context = new MyTravelContext();

        System.out.println(context.executeStrategy(new Airplane()));
        System.out.println(context.executeStrategy(new HighSpeedRail()));
        System.out.println(context.executeStrategy(new Subway()));
    }
}

运行结果

出门旅游坐啥好: 飞机
出门旅游坐啥好: 高铁
出门旅游坐啥好: 地铁

框架源码中的应用

  1. spring框架中的ObjectNamingStrategy类,获取bean的beanName

总结

优点

  1. 扩展性好
  2. 运行时自由切换执行逻辑
  3. 减少if...else代码

缺点

  1. 策略过多时会产生大量的类
  2. 所有策略类都需要暴露给使用者
posted @ 2022-10-13 13:04  竹堑  阅读(77)  评论(0编辑  收藏  举报