java不知名设计模式

本文介绍了一种Java设计模式,允许通过公共接口实现多种场景下的差异化处理,如电影和音乐服务独立调用。关键在于ModelService接口和不同ModelImpl的实现,以及ModelUtil中的服务映射和场景调用.
摘要由CSDN通过智能技术生成

目前在项目中使用到一个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);
    }
}

打印结果
在这里插入图片描述
该设计模式 可以实现同样的方法,不同场景可以有不同的处理结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值