我有一个 TriggerType 枚举,可以在其中添加不同的触发器
public enum TriggerType {
meta,data,list,toggle
}
这些触发器类型在不同的处理程序(例如组件、仪表板等)内部使用,以识别通过 switch-case 在处理程序内部触发哪个触发器,例如,下面给出了通过 switch-case 使用触发器的 ComponentHandler 的代码片段
@Override
public TriggerResultInterface executeTriggerJob(TriggerEventHelper triggerEventHelper) throws TriggerHandlerException {
switch (triggerEventHelper.getTriggerName()) {
case meta:
return getMetaComponentConfig(triggerEventHelper);
case data:
return getComponentData(triggerEventHelper);
default:
LOGGER.debug(INVALID_TRIGGER_NAME_CONFIGURED);
throw new TriggerHandlerException(INVALID_TRIGGER_NAME_CONFIGURED);
}
}
想象一下,如果我想添加一个新的触发器,我必须更新枚举类,这是不可避免的,同时我必须更新每个触发器需要使用的处理程序类,这种编码设计方式是吗?好还是有任何其他更好的解决方案可以增强此代码并遵循 SOLID 原则和更好的设计。
我想强调的是,这个问题不是重复的this https://stackoverflow.com/questions/14136721/converting-many-if-else-statements-to-a-cleaner-approach。在这种情况下,每种类型只需要一种行为(例如:convertToMp3)。但我的问题指的是我的枚举类型(触发器类型)取决于它可能使用的处理程序,因此每个触发器类型枚举的行为或实现将取决于它所使用的处理程序的要求。
解决方案之一是使用多态性以不同的方式处理触发器。例如,您可以声明Trigger
接口并有多种实现。在这种情况下,当您需要新的触发器类型时,您只需实现此接口即可,而无需触及现有代码:
public interface Trigger {
TriggerResultInterface execute(TriggerEventHelper eventHelper);
}
public class MetaTrigger implements Trigger {
@Override
TriggerResultInterface execute(TriggerEventHelper eventHelper) {
// do meta trigger work here
}
}
public class DataTrigger implements Trigger {
@Override
TriggerResultInterface execute(TriggerEventHelper eventHelper) {
// do data trigger work here
}
}
// ...
public TriggerResultInterface executeTriggerJob(TriggerEventHelper eventHelper) {
eventHelper.getTrigger().execute(eventHelper);
}
在这种情况下,不可能添加新的触发器类型而不实现其行为。
如果您需要默认实现,则可以使用基类而不是接口(在 Java 8 中,您可以将默认实现直接添加到接口中)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)