入口
@GetMapping("/annonation")
public String annonation(@RequestParam String annonId) {
//确定使用哪个枚举
Annonation annonation = Annonation.valueOf(annonId);
//调用相关枚举的具体实现方法。此处的参数是随意的,看抽象方法的定义,当然是为了之后的业务逻辑需要的数据
return annonation.aa(annonId);
}
枚举
public enum Annonation {
A("A",""){
@Override
public String aa(String str) {
TestAnnonationA a=Factory.getBeanClass(TestAnnonationA.class);
return a.test(str);
}
},
B("B",""){
@Override
public String aa(String str) {
TestAnnonationB a=Factory.getBeanClass(TestAnnonationB.class);
return a.test(str);
}
};
private String code;
private String desc;
Annonation(String code, String desc) {
this.code = code;
this.desc = desc;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
//抽象方法 自我理解这类似于一个接口,让每个枚举去做具体的实现
public abstract String aa(String string);
工厂方法
@Component
public class Factory implements ApplicationContextAware {
//工厂必须继承这个这类 ,相当于告诉容器 这个是bean工厂
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
Factory.applicationContext = applicationContext;
}
public static <T> T getBeanClass(Class clazz) throws BeansException{
return (T) applicationContext.getBean(clazz);
}
具体实现类
@Service
//@RiShangMianShui("A")
public class TestAnnonationA {
public String test(String str) {
System.out.println("A----------"+str);
return str;
}
}
@Service
//@RiShangMianShui("B")
public class TestAnnonationB {
public String test(String str) {
System.out.println("B----------"+str);
return str;
}
}
本文介绍了一种基于枚举和工厂模式的实现方案,通过枚举类的不同实例调用同一抽象方法,达到多态的效果。并通过Spring框架的依赖注入获取具体实现类,展示了灵活的代码设计方式。
1352

被折叠的 条评论
为什么被折叠?



