首页 > 编程语言 >策略模式-java实战

策略模式-java实战

时间:2024-12-09 18:42:35浏览次数:8  
标签:实战 java service 模式 strategy example import com public

策略模式(Strategy Pattern)是一种行为型模式。它定义了一系列算法,并将每一个算法封装起来,使它们可以互换使用,算法的变化不会影响使用算法的用户。

使用场景

当一个系统中有许多类,它们之间的区别仅在于它们的行为时。

存在多种相似算法,使用条件语句(如if...else、switch...case)维护逻辑变化。

场景假设

存在一个功能页面,操作的功能需要按历史数据、实时数据、未来数据等时间条件实现。

此时,普通实现,就会存在大量的以下条件语句

  if(date == 历史){
    历史业务逻辑
  }
  if(date == 未来){
    未来业务逻辑
  }
  if(date == 实时){
    实时业务逻辑
  }

如果,后续业务出现新的时间条件,就需要一直往后面叠加if条件,就会变的越来越长,慢慢就形成业内所说的屎山。

实现步骤

  • 定义策略接口:所有策略类都将实现这个统一的接口。

  • 实现具体策略类:每个策略类封装一个具体的算法或行为。

  • 实现环境类:包含一个策略对象的引用,并通过该引用调用策略。

代码示例

  • 定义通用返回vo

      public class BaseVo {
      
      }
    
  • 定义策略接口:

        import com.example.service.strategy.vo.BaseVo;
    
        import java.util.List;
    
        public interface Strategy {
    
            List<Object> queryList();
    
        }
    
  • 定义具体返回对象

      public class FutureVo extends BaseVo{
      }
      
      public class HisVo extends BaseVo{
      }
    
      public class RealtimeVo extends BaseVo{
      }
    
  • 定义具体策略

    
      //策略枚举
    
      import com.example.service.strategy.Future;
      import com.example.service.strategy.History;
      import com.example.service.strategy.Realtime;
      import com.example.service.strategy.Strategy;
    
      public enum Type {
    
          HIS("0", new History()),
          TIME("1",new Realtime()),
          FUTURE("2",new Future())
          ;
    
          private final String key;
    
          private final Strategy strategy;
    
          Type(String s, Strategy strategy) {
              this.key= s;
              this.strategy= strategy;
          }
    
          public String getKey() {
              return key;
          }
    
          public Strategy getStrategy() {
              return strategy;
          }
      }
      
      // his
    
      import com.example.service.strategy.vo.BaseVo;
      import com.example.service.strategy.vo.HisVo;
    
      import java.util.Collections;
      import java.util.List;
    
      public class History implements Strategy {
    
          @Override
          public List<Object> queryList() {
              System.out.println("History");
              return Collections.singletonList(new HisVo());
          }
      }
    
      //future
    
      import com.example.service.strategy.vo.BaseVo;
      import com.example.service.strategy.vo.FutureVo;
    
      import java.util.Collections;
      import java.util.List;
    
      public class Future implements Strategy {
    
          @Override
          public List<Object> queryList(){
              System.out.println("Future");
              return Collections.singletonList(new FutureVo());
          }
      }
      
      //real time
    
      import com.example.service.strategy.vo.BaseVo;
      import com.example.service.strategy.vo.RealtimeVo;
    
      import java.util.Collections;
      import java.util.List;
    
      public class Realtime implements Strategy {
    
          @Override
          public List<Object> queryList() {
              RealtimeVo realtimeVo = new RealtimeVo();
              System.out.println("Realtime");
              return Collections.singletonList(realtimeVo);
          }
    
      }
      
    
  • 定义策略工具类

        import com.example.service.strategy.enums.Type;
        import com.example.service.strategy.vo.BaseVo;
        import org.springframework.stereotype.Service;
    
        import java.util.List;
    
        @Service
        public class ClientContext {
    
            public List<Object> query(Type type){
              return getStrategy(type).queryList();
            }
    
            public Strategy getStrategy(Type type){
                return type.getStrategy();
            }
        }
      
    
  • 测试类

      import com.example.service.strategy.enums.Type;
    
      public class Test {
    
          public static void main(String[] args){
            ClientContext contextClient = new ClientContext();
            List<Object> hisVoList= contextClient.query(Type.HIS);
            List<Object> timeVoList=contextClient.query(Type.TIME);
            List<Object> futureVos= contextClient.query(Type.FUTURE);
          }
    
      }
    
    
  • 结果

      History
      Realtime
      Future
    
    

将策略交给spring容器管理的实现方式

差异主要是在工具类/环境类的实现,即策略的获取。

  • 定义策略接口

      import com.example.service.strategy.vo.BaseVo;
    
      import java.util.List;
    
      public interface Strategy {
    
          String getKey();
    
          List<Object> queryList();
    
      }
      
    
  • 定义策略具体类

      // 策略枚举类
    
      public enum StrategyType {
    
          HIS("0"),
          TIME("1"),
          FUTURE("2")
          ;
    
          private final String key;
    
    
          StrategyType(String s) {
              this.key= s;
          }
    
          public String getKey() {
              return key;
          }
    
      }
    
      //策略类
      
      //his
    
      import com.example.service.strategy.enums.StrategyType;
      import com.example.service.strategy.vo.BaseVo;
      import com.example.service.strategy.vo.HisVo;
    
      import java.util.Collections;
      import java.util.List;
    
      public class History implements Strategy {
    
          @Override
          public String getKey() {
              return StrategyType.HIS.getKey();
          }
    
          @Override
          public List<Object> queryList() {
              System.out.println("History");
              return Collections.singletonList(new HisVo());
          }
      }
    
      //future
    
      import com.example.service.strategy.enums.StrategyType;
      import com.example.service.strategy.vo.BaseVo;
      import com.example.service.strategy.vo.FutureVo;
    
      import java.util.Collections;
      import java.util.List;
    
      public class Future implements Strategy {
    
          @Override
          public String getKey() {
              return StrategyType.FUTURE.getKey();
          }
    
          @Override
          public List<Object> queryList(){
              System.out.println("Future");
              return Collections.singletonList(new FutureVo());
          }
      }
    
      //real time
    
      import com.example.service.strategy.enums.StrategyType;
      import com.example.service.strategy.vo.BaseVo;
      import com.example.service.strategy.vo.RealtimeVo;
    
      import java.util.Collections;
      import java.util.List;
    
      public class Realtime implements Strategy {
    
          @Override
          public String getKey() {
              return StrategyType.TIME.getKey();
          }
    
          @Override
          public List<Object> queryList() {
              RealtimeVo realtimeVo = new RealtimeVo();
              System.out.println("Realtime");
              return Collections.singletonList(realtimeVo);
          }
    
      }
      
    
  • 定义策略上下文类

      import com.example.service.strategy.enums.StrategyType;
      import com.example.service.strategy.vo.BaseVo;
      import org.springframework.beans.BeansException;
      import org.springframework.context.ApplicationContext;
      import org.springframework.context.ApplicationContextAware;
      import org.springframework.stereotype.Component;
    
      import java.util.HashMap;
      import java.util.List;
      import java.util.Map;
    
      @Component
      public class SpringClientContext implements ApplicationContextAware {
    
          private final Map<String,Strategy> strategyMap = new HashMap<>();
    
          public List<Object> query(StrategyType strategyType){
              return getStrategy(strategyType).queryList();
          }
    
          public Strategy getStrategy(StrategyType strategyType){
              return strategyMap.get(strategyType.getKey());
          }
    
    
          @Override
          public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
              Map<String,Strategy> tmpMap = applicationContext.getBeansOfType(Strategy.class);
              tmpMap.values().forEach(strategy -> strategyMap.put(strategy.getKey(),strategy));
          }
      }
    

标签:实战,java,service,模式,strategy,example,import,com,public
From: https://www.cnblogs.com/fun-seeker/p/18594859

相关文章

  • JavaScript 基础语法入门
    JavaScript是一种运行在浏览器中的编程语言,适合初学者快速上手。以下内容是JavaScript的基础语法介绍。1.JavaScript的引入方式内嵌式在HTML文件中,通过<script>console.log("Hello,JavaScript!");</script>外部文件引入将JavaScript写入独立的文......
  • 《Java核心技术I》映射条目的原子更新
    映射条目的原子更新ConcurrentHashMap只有部分原子更新。JavaAPI提供了一些新方法,例如:compute方法可以提供一个键和一个计算新值的函数。map.compute(word,(k,v)->v==null?1:v+1)注释:ConcurrentHashMap中不允许有null值。很多方法都使用null来指示映射中某个给定的键......
  • Java基础 —— 集合(二)
    Collection接口Collection接口常用方法booleanadd(Ee):在集合末尾添加元素booleanremove(Objecto):若集合中存在与o相同的元素,则删除,然后返回truevoidclear():清空集合内的所有元素booleancontains(Objecto):判断集合中是否存在该元素booleanisEmpty():判断集合是否为空......
  • JS-2 JavaScript语句、标识符
    1、语句JavaScript程序的单位是行(line),也就是一行一行地执行。一般情况下,每一行就是一个语句varnum=10;语句以分号结尾,一个分号就表示一个语句结束。 在html中用script写css 2、标识符标识符(identifier)指的是用来识别各种值的合法名称。最常见的标识符......
  • Java 的 SPI 都不了解?这很难让你通过
    引言今天和大家分享一下一个在 Java 开发中非常重要的概念—— SPI(ServiceProviderInterface)。SPI 直译叫做服务提供者接口,是一种用于动态加载服务的机制。它不仅能够帮助我们构建更加灵活和可扩展的应用程序,还能让我们的代码更加简洁和易于维护。希望通过本文,大家能够对 ......
  • C++_默认构造函数和重载以及设计模式
    类和类之间关系类外:静态变量,是在编译阶段就分配好空间,对象还没创建的时候就有了空间类:类-对象-对象是类的一个实例类头(classhead)和类体(classbody)。将数据和行为封装在单个单元中--封装成员变量成员函数成员变量称为属性(property);成员函数称为方法(metho......
  • Java基础 —— 集合(一)
    集合(一)数组和集合的区别数组是固定长度的数据结构,而集合是动态的数据结构数组可以包含基本数据类型和对象,集合只能包含对象数组只能存放同一类型的数据,而集合可以蹲房不同类型的数组可以直接访问元素,集合需要通过迭代器或其他方法访问元素集合的分类 根据上图......
  • 白骑士的JavaScript教学生态系统篇之现代前端开发流程 5.3.4 持续集成与部署(CI/CD)
            在现代软件开发中,持续集成与持续部署(CI/CD)已经成为提高开发效率、确保软件质量的关键流程。CI/CD不仅能够自动化代码的构建、测试和部署,还能帮助开发团队快速地将新功能和修复发布到生产环境。本文将深入探讨CI/CD的概念、优势、常用工具以及如何在JavaScript......
  • JavaScript 写css的内联样式
    一、使用style属性-直接设置单个CSS属性//获取元素varelement=document.getElementById("myElement");//设置样式element.style.color="red";element.style.backgroundColor="blue";element.style.fontSize="20px";二、使用cssText属性-一次性设......
  • 21天掌握javaweb-->第12天:Spring Boot项目优化与安全性
    SpringBoot项目优化与安全性1.SpringBoot性能优化1.1减少依赖项评估项目的依赖项,并确保只引入必要的依赖。较多的依赖项可能会增加启动时间,因为它们需要被扫描和初始化。通过删除不需要的依赖项或仅引入必要的模块,可以减少类路径的扫描和初始化时间。1.2调整自动配置......