很多时候 一个功能 在不同的场景下 实现或者说 业务逻辑是不一样的 比如 支付,同样是支付 可以采用 微信支付、支付宝支付、银行卡支付 等,这个时候 我们可以用一个 称之为 扩展点的东西 来 丰富我们的设计 使代码 更易读 更好维护
这里提供几种思想 算是抛砖引玉,希望看到的朋友 如果有好的idea 可以一起探讨下

一个接口 多个 实现类

策略模式 + 适配器

封装一个组件 核心是一个 map(ConcurrentHashMap)

key 是 一个以某个符号(比如 . )分割的字符串 + 类的名字 ,value 是 该类的class 对象 。项目启动的时候 扫描被某个自定义注解(属性值就是 这个 key) 注解的类。然后 将 该类 注入到 这个map中 ,在业务中 根据不同的 key 获取对应的类 执行对应的子业务

伪码

  1. @Capacity(code="pay.default",name="",desc="")
  2. public interface PayCapacity {
  3. pay();
  4. }
  1. @Extension(code="pay.default",name="",desc="")
  2. public class ZhiFuBaoPayExtension implement PayCapacity{
  3. pay() {}
  4. }
  5. @Extension(code="pay.weixin")
  6. public class WechatPayExtension implement PayCapacity{
  7. pay() {}
  8. }
  9. @Extension(code="pay.zhifubao")
  10. public class ZhiFuBaoPayExtension implement PayCapacity{
  11. pay() {}
  12. }
  1. public class CapacityComponent {
  2. ConcurrentHashMap map = new ConcurrentHashMap();
  3. {
  4. map.put("pay.default.ZhiFuBaoPayExtension",ZhiFuBaoPayExtension.class);
  5. map.put("pay.weixin.WechatPayExtension",WechatPayExtension.class);
  6. map.put("pay.zhifubao.ZhiFuBaoPayExtension",ZhiFuBaoPayExtension.class);
  7. }
  8. }

spi

  • java spi 机制
  • dubbo spi 机制