策略模式--在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,传入参数即可
相关推荐
best_virtuoso几秒前
PostgreSQL 常见数组操作函数语法、功能
java·数据结构·postgresql
yudiandian20141 分钟前
02 Oracle JDK 下载及配置(解压缩版)
java·开发语言
Q_Q51100828521 分钟前
python+uniapp基于微信小程序的旅游信息系统
spring boot·python·微信小程序·django·flask·uni-app·node.js
楚韵天工40 分钟前
宠物服务平台(程序+文档)
java·网络·数据库·spring cloud·编辑器·intellij-idea·宠物
helloworddm42 分钟前
Orleans Stream SubscriptionId 生成机制详解
java·系统架构·c#
失散131 小时前
分布式专题——43 ElasticSearch概述
java·分布式·elasticsearch·架构
ajsbxi1 小时前
【Java 基础】核心知识点梳理
java·开发语言·笔记
Q_Q5110082851 小时前
python基于web的汽车班车车票管理系统/火车票预订系统/高铁预定系统 可在线选座
spring boot·python·django·flask·node.js·汽车·php
聪明的笨猪猪1 小时前
Java JVM “调优” 面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
重整旗鼓~1 小时前
28.redisson源码分析分布式锁
java·开发语言