策略模式--在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,传入参数即可
相关推荐
2202_754421548 分钟前
生成MPSOC以及ZYNQ的启动文件BOOT.BIN的小软件
java·linux·开发语言
蓝染-惣右介10 分钟前
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
java·数据库·tomcat·mybatis
小林想被监督学习11 分钟前
idea怎么打开两个窗口,运行两个项目
java·ide·intellij-idea
HoneyMoose13 分钟前
IDEA 2024.3 版本更新主要功能介绍
java·ide·intellij-idea
我只会发热14 分钟前
Java SE 与 Java EE:基础与进阶的探索之旅
java·开发语言·java-ee
是老余16 分钟前
本地可运行,jar包运行错误【解决实例】:通过IDEA的maven package打包多模块项目
java·maven·intellij-idea·jar
crazy_wsp16 分钟前
IDEA怎么定位java类所用maven依赖版本及引用位置
java·maven·intellij-idea
.Ayang18 分钟前
tomcat 后台部署 war 包 getshell
java·计算机网络·安全·web安全·网络安全·tomcat·网络攻击模型
bjzhang7524 分钟前
SpringBoot开发——Maven多模块工程最佳实践及详细示例
spring boot·maven·maven多模块工程
一直学习永不止步24 分钟前
LeetCode题练习与总结:最长回文串--409
java·数据结构·算法·leetcode·字符串·贪心·哈希表