目前在项目中使用到一个java设计模式,具体名称没查到,后面再补。
该模式使用场景:
多个场景调用同一个方法,可以产生不同的结果。有点类似于java的多态特性。
定义公共接口
public interface ModelService {
/**
* 标识
*/
String key();
/**
* 实现类执行功能
*/
@Transactional(rollbackFor = Exception.class)
List<String> queryStr(ModelWrapper wrapper);
}
定义Wrapper接口参数
@Data
public class ModelWrapper {
// 标识
private String modelEvent;
// 传参对象
private List<String> content;
}
定义不同的公共接口实现
@Component
public class MovieModelImpl implements ModelService {
// 实现类单独标识
@Override
public String key() {
return "movie";
}
@Override
public List<String> queryStr(ModelWrapper wrapper) {
List<String> content = wrapper.getContent();
return content;
}
}
@Component
public class MusicModelImpl implements ModelService {
@Override
public String key() {
return "music";
}
@Override
public List<String> queryStr(ModelWrapper wrapper) {
List<String> content = wrapper.getContent();
return content;
}
}
核心部分,启动服务时,把接口bean都封装到map
@Component
public class ModelUtil implements ApplicationContextAware {
Map<String, ModelService> serviceMaps = new HashMap<>();
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
Map<String, ModelService> modelBeans = applicationContext.getBeansOfType(ModelService.class);
modelBeans.forEach((beanName, modelImpl) -> {
serviceMaps.put(modelImpl.key(), modelImpl);
});
}
/**
* 公共接口
*/
public List<String> getListStr(ModelWrapper wrapper) {
ModelService modelService = serviceMaps.get(wrapper.getModelEvent());
// 公共方法
return modelService.queryStr(wrapper);
}
}
不同场景的参数处理,及方法调用
@Component
public class MovieService {
@Autowired
private ModelUtil modelUtil;
public List<String> getMovie() {
ModelWrapper wrapper = new ModelWrapper();
// 标识
wrapper.setModelEvent("movie");
List<String> list = new ArrayList<>();
list.add("泰坦尼克号");
list.add("月光宝盒");
wrapper.setContent(list);
return modelUtil.getListStr(wrapper);
}
}
@Component
public class MusicService {
@Autowired
private ModelUtil modelUtil;
public List<String> getMusic() {
ModelWrapper wrapper = new ModelWrapper();
wrapper.setModelEvent("music");
List<String> list = new ArrayList<>();
list.add("七里香");
list.add("不要说爱");
wrapper.setContent(list);
return modelUtil.getListStr(wrapper);
}
}
功能测试
@SpringBootTest
class RedisSessionApplicationTests {
@Autowired
private MovieService movieService;
@Autowired
private MusicService musicService;
@Test
void contextLoads() {
List<String> movie = movieService.getMovie();
List<String> music = musicService.getMusic();
System.out.println(movie);
System.out.println(music);
}
}
打印结果
该设计模式 可以实现同样的方法,不同场景可以有不同的处理结果。