策略模式--在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,传入参数即可
相关推荐
尚学教辅学习资料22 分钟前
基于微信小程序的电商平台+LW示例参考
java·微信小程序·小程序·毕业设计·springboot·电商平台
尘浮生24 分钟前
Java项目实战II基于微信小程序的移动学习平台的设计与实现(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·学习·微信小程序·小程序
2401_857610031 小时前
Spring Boot框架:电商系统的技术优势
java·spring boot·后端
希忘auto1 小时前
详解MySQL安装
java·mysql
冰淇淋烤布蕾1 小时前
EasyExcel使用
java·开发语言·excel
拾荒的小海螺1 小时前
JAVA:探索 EasyExcel 的技术指南
java·开发语言
Jakarta EE2 小时前
正确使用primefaces的process和update
java·primefaces·jakarta ee
马剑威(威哥爱编程)2 小时前
哇喔!20种单例模式的实现与变异总结
java·开发语言·单例模式
java—大象2 小时前
基于java+springboot+layui的流浪动物交流信息平台设计实现
java·开发语言·spring boot·layui·课程设计
ApiHug3 小时前
ApiSmart x Qwen2.5-Coder 开源旗舰编程模型媲美 GPT-4o, ApiSmart 实测!
人工智能·spring boot·spring·ai编程·apihug