策略模式--在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,传入参数即可
相关推荐
Deamon Tree2 分钟前
如何保证缓存与数据库更新时候的一致性
java·数据库·缓存
9号达人4 分钟前
认证方案的设计与思考
java·后端·面试
大G的笔记本11 分钟前
MySQL 中的 行锁(Record Lock) 和 间隙锁(Gap Lock)
java·数据库·mysql
R.lin12 分钟前
Java支付对接策略模式详细设计
java·架构·策略模式
没有bug.的程序员13 分钟前
Spring Boot 常见性能与配置优化
java·spring boot·后端·spring·动态代理
没有bug.的程序员17 分钟前
Spring Boot Actuator 监控机制解析
java·前端·spring boot·spring·源码
三次拒绝王俊凯17 分钟前
java求职学习day47
java·开发语言·学习
包饭厅咸鱼39 分钟前
autojs----2025淘宝淘金币跳一跳自动化
java·javascript·自动化
骇客野人1 小时前
Spring Boot项目快速稳健架构指南
spring boot·后端·架构
码住懒羊羊1 小时前
【C++】模板进阶 | 继承
android·java·c++