很多时候 一个功能 在不同的场景下 实现或者说 业务逻辑是不一样的 比如 支付,同样是支付 可以采用 微信支付、支付宝支付、银行卡支付 等,这个时候 我们可以用一个 称之为 扩展点的东西 来 丰富我们的设计 使代码 更易读 更好维护
这里提供几种思想 算是抛砖引玉,希望看到的朋友 如果有好的idea 可以一起探讨下
一个接口 多个 实现类
策略模式 + 适配器
封装一个组件 核心是一个 map(ConcurrentHashMap)
key 是 一个以某个符号(比如 . )分割的字符串 + 类的名字 ,value 是 该类的class 对象 。项目启动的时候 扫描被某个自定义注解(属性值就是 这个 key) 注解的类。然后 将 该类 注入到 这个map中 ,在业务中 根据不同的 key 获取对应的类 执行对应的子业务
伪码
@Capacity(code="pay.default",name="",desc="")
public interface PayCapacity {
pay();
}
@Extension(code="pay.default",name="",desc="")
public class ZhiFuBaoPayExtension implement PayCapacity{
pay() {}
}
@Extension(code="pay.weixin")
public class WechatPayExtension implement PayCapacity{
pay() {}
}
@Extension(code="pay.zhifubao")
public class ZhiFuBaoPayExtension implement PayCapacity{
pay() {}
}
public class CapacityComponent {
ConcurrentHashMap map = new ConcurrentHashMap();
{
map.put("pay.default.ZhiFuBaoPayExtension",ZhiFuBaoPayExtension.class);
map.put("pay.weixin.WechatPayExtension",WechatPayExtension.class);
map.put("pay.zhifubao.ZhiFuBaoPayExtension",ZhiFuBaoPayExtension.class);
}
}
spi
- java spi 机制
- dubbo spi 机制