策略设计模式解读

前言

在软件开发中常会遇到实现某一个功能可以有多种策略或算法,根据实际情况选择不同的算法或策略。如果将这些算法或者策略抽象出来,提供一个统一的接口。不同的算法或策略有不同的实现类。可以通过注入不同的实现对象来实现算法或策略的动态替换,这就是策略模式

定义

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们还可以互相替换。策略模式让算法独立于使用它的客户而独立变化

UML

在这里插入图片描述

使用场景

  • 针对同一类问题的多种处理方式,仅仅是具体行为有差别
  • 需要安全地封装多种同一类型的操作时
  • 出现同一抽象类多个子类,而又需要使用if-else 或者switch-case来选择具体子类时

实操

城市公共交通出行方式费用进行举例,一般实行分段计价:乘坐距离越远,价格越高

// 定义一个抽象的价格计算接口
public interface CalculateStrategy{
  int calculatePrice(int km)
}

// 公交车的计算策略类
public class BusStrategy implements CalculateStrategy{
    @override
    public  int calculatePrice(int km){
         return  1 //  这里简单起见,实际按照公交车乘车规则计费
     }
}

// 地铁的计算策略类
public class SubwayStrategy implements CalculateStrategy{
    @override
    public  int calculatePrice(int km){
         return  2 //  这里简单起见,实际按照地铁乘车规则计费
     }
}

// 出行价格计算器
public class TranficCalculator{
   CalculateStrategy  mStrategy;
   public void setStrategy(CalculateStrategy  mStrategy){
       this.mStrategy=mStrategy
    }
    public int calculatePrice(int km){
       return  mStrategy.calculatePrice(km);
    }
}

public static void main(String [] args){
    TranficCalculator calculator=new  TranficCalculator ();
    // 公交车费用
     calculator.setStrategy(new BusStrategy());
   //  地铁费用
    calculator.setStrategy(new SubwayStrategy());
}

小结

策略模式主要用来分离算法,在相同的行为抽象下有不同的具体实现策略。这个模式很好地演示了开闭原则,也就是定义抽象,注入不同实现,从而达到很好的可拓展性

优点

  • 策略模式提供了管理相关的算法族的办法,算法可以切换
  • 避免使用多重条件转移语句

缺点

  • 客户端知道所有的策略类,并自行决定使用哪一个策略类。策略类完成暴露了
  • 策略类有时会非常多

猜你喜欢

转载自blog.csdn.net/xufei5789651/article/details/100593144