Skip to content

策略模式

策略模式(Strategy Pattern)属于行为设计模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户,从而使得算法可以在不影响到客户端的情况下发生变化。(策略模式封装了变化

类图

策略模式

主要角色

  • 策略接口(Strategy Interface):定义所有支持的算法的公共接口。这是一个抽象类或接口,声明了具体策略类需要实现的方法。
  • 具体策略类(Concrete Strategies):实现了策略接口,提供了具体的算法实现。
  • 上下文(Context):持有一个策略接口的引用。上下文通常会包含一个设置具体策略的方法,允许在运行时切换策略。

适用场景

  • 在不同时间应用不同的业务规则,可以使用考虑使用策略模式处理这种变化的可能性

  • 多个相似行为的场景:当一个对象根据情况需要在多种算法或行为中选择一种来执行时。

  • 行为或算法可互换的场景:算法的实现细节需要能够独立于使用它们的类进行变化或扩展。

  • 避免使用多重条件判断:如果一个类中有大量if-else或switch-case语句用于选择算法,可以考虑使用策略模式来替代,以提高代码的清晰度和可维护性。

优点

  • 简化了单元测试

  • 封装了变化,策略模式使得算法的定义与使用分离,提高了系统的灵活性和可扩展性。

  • 每种算法都被封装在单独的类中,方便复用。

  • 易于理解和维护:通过将复杂的条件逻辑分散到各个策略类中,使得代码更加清晰和易于维护。

  • 运行时可配置:可以在运行时选择不同的策略,增加了程序的灵活性

示例

java
public class ShopBasicTest {

    public static void main(String[] args){

        Context context;

        //由于实例化不同的策略,所以最终在调用
        //context.contextInterface()时,所
        //获得的结果就不尽相同
        context = new Context(new ConcreteStrategyA());
        context.contextInterface();

        context = new Context(new ConcreteStrategyB());
        context.contextInterface();

        context = new Context(new ConcreteStrategyC());
        context.contextInterface();


    }
}

//抽象算法类
abstract class Strategy{
    //算法方法
    public abstract void algorithmInterface();

}

//具体算法A
class ConcreteStrategyA extends Strategy {
    //算法A实现方法
    public void algorithmInterface() {
        System.out.println("算法A实现");
    }
}

//具体算法B
class ConcreteStrategyB extends Strategy {
    //算法B实现方法
    public void algorithmInterface() {
        System.out.println("算法B实现");
    }
}

//具体算法C
class ConcreteStrategyC extends Strategy {
    //算法C实现方法
    public void algorithmInterface() {
        System.out.println("算法C实现");
    }
}

//上下文
class Context {
    Strategy strategy;
    //初始化时,传入具体的策略对象
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }
    //上下文接口
    public void contextInterface() {
        //根据具体的策略对象,调用其算法的方法
        strategy.algorithmInterface();
    }
}

Released under the MIT License.