策略模式
- 策略模式主要分为三部分:
- 抽象策略类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中应用
- 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;
}
}
- 上下文使用
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();
}
}
- 使用时,只需要new Context,传入参数即可