首页 >> 中医药茶

手把手传道你如何实现代码扩展点设计

发布时间:2025年11月22日 12:17

O }}

这仿佛,在正逻辑学编译机内只要根据完全子类,从车上间类提供处理方法机内类,然后执行者方法即可,如下:

DeviceStatusEnum state = DeviceStatusEnum.get(status.getStatus());StateHandler handler = stateContext.getHandler(state);handler.handle(request.getSN(), request.getBerthCode());

这仿佛即可抑止相异的if-else

关键问题

通过上述的框架一,我们发挥作用了抑止整体的if-else,但是我们便险恶思维下,框架一不会有什么关键问题? 很微小,这是针对就其金融业务的一个发挥作用方法,该发挥作用方法并不需要1个范例类、1个API、相异的N个发挥作用类,那么当我们的金融业务编译机内有多个多种不同金融业务的if-else,每个金融业务都并不需要建立2+N个类,造变成了类衰减。

所以,针对该关键问题,我们还并不需要对上述的发挥作用方法完变成抽象化,让它更是可视 。

发挥作用框架二(最终解决框架)

通过对框架一发挥作用的思维,我们可以对以下几个点完变成优化

•针对API类,我们可以抽象化多种不同金融业务的API,该API只有一个方法,运用于留在就其某个金融业务的可数类•针对可数类,多种不同金融业务不会有多种不同的可数类,而可数类的抽象化就是他们的父类:Enum•针对范例类,取而代之的map文件系统key是就其某个可数类,value是多种不同的发挥作用类;而这里为了发挥作用多个金融业务扩张点,我们key可以结构设计为可数类的父类Enum,value为多种不同发挥作用类的沙罗

就其的编译机内如下:

1.建立一个抽象化API,运用于留在就其某个金融业务的可数类

public interface IExtensionHandlerextends Enum>{ Y extension();}

这里的泛型Y就是就其某个金融业务的可数类

2.建立一个范例类的API,并发挥作用其预设发挥作用

public interface IExtensionHandlerFactory { /** * 填充扩张处理方法机内 * @param extensionHandler 处理方法机内 * @param 扩张点 */ void addExtensionHandler(IExtensionHandler extensionHandler); /** * 提供扩张点处理方法机内 * @param extension 扩张点 * @param type 处理方法机内子类 * @param 扩张处理方法机内 * @param 扩张点 */ T getExtensionHandler(Y extension, Class type);}

范例类的预设发挥作用

@Slf4jpublic class DefaultExtensionHandlerFactoryImpl implements IExtensionHandlerFactory, ApplicationContextAware { private final Map> serviceListCache = new ConcurrentHashMap<>(); private final Map serviceCache = new ConcurrentHashMap<>(); @Override public void addExtensionHandler(IExtensionHandler extensionHandler) { Assert.notNull(extensionHandler.extension(), "add extension handler failed, bean class " + extensionHandler.getClass().getName() + " extension is null"); serviceListCache.putIfAbsent(extensionHandler.extension(), new LinkedList<>()); serviceListCache.get(extensionHandler.extension()).add(extensionHandler); } @Override public T getExtensionHandler(Y extension, Class type) { ExtensionCacheKey cacheKey = new ExtensionCacheKey(extension, type); IExtensionHandler result = this.serviceCache.get(cacheKey); if (result == null) { List extensionHandlers = serviceListCache.getOrDefault(extension, Collections.synchronizedList(Collections.emptyList())); for (IExtensionHandler extensionHandler : extensionHandlers) { if (type.isAssignableFrom(extensionHandler.getClass())) { result = extensionHandler; serviceCache.put(cacheKey, result); break; } } if (result == null) { log.warn("No IExtensionHandler found by CacheKey : " + cacheKey + " !"); } } return (T) result; } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { Map handlerMap = applicationContext.getBeansOfType(IExtensionHandler.class); log.info("恶作剧加载扩张ing ..."); long start = System.currentTimeMillis(); handlerMap.forEach((k, v) -> { //剔除重新组合类自己 if (!this.getClass().isAssignableFrom(v.getClass())) { addExtensionHandler(v); } }); long end = System.currentTimeMillis(); log.info("加载扩张点结束,耗时: {}, 扩张点个数: {}", end - start, handlerMap.size()); }}

在预设的范例发挥作用类以后,我们还多了一个Map,该Map是为了提高扩张点的查找而结构设计的,如果只是使用serviceListCache,那么每次根据某个金融业务的可数类不会留在相异的扩张处理方法机内沙罗,并不需要便循环一次才能寻觅相异的处理方法机内,这里是结构设计了一个文件系统Key: ExtensionCacheKey, 编译机内发挥作用如下

@Data@AllArgsConstructor@ToString@EqualsAndHashCodepublic class ExtensionCacheKey { private T extension; private Class extensionHandlerClass;}

一个金融业务可数类,不必要有多种不同子类的扩张处理方法API,serviceListCache的value取值为什么结构设计变成List和为什么并不需要结构设计一个ExtensionCacheKey的原因所在。

最后

这个扩张点结构设计虽然简单,但是在我系统化的项目以后有大量的使用,也延揽大家理解并使用,对于复杂金融业务的处理方法更加有帮助。

另外扩张点结构设计还有另外一种方法,基于注解的方法,就其发挥作用可以搜下 COLA 4.0

提供明晰程式码地址:

广西男科去哪看
上海看癫痫哪家医院最好
郑州看白癜风去哪好
重庆看妇科去哪好
南昌白癜风医院那家比较好
药企动态
男人尿痛
脾胃虚寒怎么调理
感染内科
脊柱外科

上一篇: 有关抗原检验,看这篇就够了

下一篇: 投资者提问:请问贵公司参股的金豆数据目前在DRG/DIP行业中属于什么样的...

友情链接