策略模式--在SpringBoot中的使用

策略模式

  1. 策略模式主要分为三部分:
  • 抽象策略类AbstractStrategy:负责定义抽象方法,具体策略类的继承
  • 具体策略类ContentStrategy:负责策略类的具体实现
  • 上下文类:ContextStrategy:负责上游模块的调用。包含一个策略属性,一个调用方法

策略模式实现

抽象策略类

java 复制代码
public Abstract class Animal{
   public abstract Object eat();
}

具体策略类

  • 可以有多个具体策略类
java 复制代码
public class Cat extends Animal{

    @Override
    public Object eat(){
       System.out.println("猫吃鱼");
    }
}

上下文类

java 复制代码
public class Context{

    private Animal animal;

    public Context(String animalType){
        if(animalType.equals("cat"){
        	this.animal=new Cat();
        }else if(){}

    }

    public Object invoke(){
        return animal.eat();
    }
}
        

使用

java 复制代码
public static void main(String[] args) {

    Context context=new Context("cat");
    context.invoke();
}

SpringBoot中应用

  1. SpringBoot中,我们的具体策略类一般会通过@Autowired注入其他Bean来调用。这个时候使用上面的就无法使用了。我们要根据Spring的Bean特性获取Bean来实现
java 复制代码
@Service
public class ContextUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        ContextUtil.applicationContext = applicationContext;
    }

    public static <T> T getBean(Class<T> clazz) {
        return applicationContext.getBean(clazz);
    }

    public static Object getBean(String name) {
        return applicationContext.getBean(name);
    }

    public static <T> T getBean(String name, Class<T> clazz) {
        return applicationContext.getBean(name, clazz);
    }

}
复制代码
  2. Context上下文通过枚举类+switch实现获取具体Bean
java 复制代码
public enum Enum02 {


    SPRING("cat", "cat"), SUMMER("dog", dog);
    private String code;
    private String beanName;

    

    Enum02(String code, String beanName) {
        this.beanName = beanName;
        this.code = code;
    }

    public String getBeanName() {
        return beanName;
    }

    public int getCode() {
        return code;
    }


    public static Enum02 getEnum(String code) {
        Enum02[] enums = Enum02.values();
        for (Enum02 enu : enums) {
            if (enu.getCode().equals(code)) {
                return enu;
            }
        }
        return null;
    }
}
  1. 上下文使用
java 复制代码
public class Context{

    private Animal animal;

    public Context(String animalType){
       Enum02 enum = Enum02.getEnum(animalType);
        switch(animalType){
            case "cat":
                this.animal=ContextUtil.getBean(enum.beanName);
                break;
        }
    }

    public Object invoke(){
        return animal.eat();
    }
}
  1. 使用时,只需要new Context,传入参数即可
相关推荐
工一木子几秒前
Java 的前世今生:从 Oak 到现代企业级语言
java·开发语言
H Journey5 分钟前
Linux su 命令核心用法总结
java·linux·服务器·su
小学仔27 分钟前
科大镜像科大镜像科大镜像
java
小旭952728 分钟前
Java 反射详解
java·开发语言·jvm·面试·intellij-idea
HalvmånEver31 分钟前
Linux:线程创建与终止上(线程五)
java·linux·jvm
无尽的沉默36 分钟前
使用Spring Initializr 快速创建Maven管理的springBoot项目
spring boot·spring·maven
m0_7482331737 分钟前
PHP版本演进:从7.x到8.x全解析
java·开发语言·php
qq_124987075338 分钟前
基于springboot的林业资源管理系统设计与实现(源码+论文+部署+安装)
java·vue.js·spring boot·后端·spring·毕业设计·计算机毕业设计
当战神遇到编程1 小时前
图书管理系统
java·开发语言·单例模式
indexsunny1 小时前
互联网大厂Java求职面试实战:Spring Boot微服务与Kafka消息队列应用解析
java·数据库·spring boot·微服务·面试·kafka·jpa