策略模式
- 策略模式主要分为三部分:
- 抽象策略类AbstractStrategy:负责定义抽象方法,具体策略类的继承
- 具体策略类ContentStrategy:负责策略类的具体实现
- 上下文类:ContextStrategy:负责上游模块的调用。包含一个策略属性,一个调用方法
策略模式实现
抽象策略类
public Abstract class Animal{public abstract Object eat();
}
具体策略类
public class Cat extends Animal{@Overridepublic Object eat(){System.out.println("猫吃鱼");}
}
上下文类
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();}
}
使用
public static void main(String[] args) {Context context=new Context("cat");context.invoke();
}
SpringBoot中应用
- SpringBoot中,我们的具体策略类一般会通过
@Autowired
注入其他Bean来调用。这个时候使用上面的就无法使用了。我们要根据Spring的Bean特性获取Bean来实现
@Service
public class ContextUtil implements ApplicationContextAware {private static ApplicationContext applicationContext;@Overridepublic 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
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;}
}
- 上下文使用
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();}
}
- 使用时,只需要new Context,传入参数即可