在Java中使代码更通用

时间:2016-08-19 17:38:45

标签: java design-patterns enums enumeration solid-principles

我有一个触发器管理器方案,我委托 触发器(换句话说,订阅触发器)到不同的处理程序< /强>

现在我有三种处理程序类型,我使用 switch-case enum (这里是枚举处理程序类型)重定向到正确的处理程序。

但我的代码似乎不可扩展,它不是通用的,它不遵循 SOLID 原则。想象一下,如果我需要更多的处理程序

我最终会来编辑我的开关案例代码,我会遇到更多会影响我的代码的圈复杂度的案例

以下是我的确切代码段

private static TriggerContext getTriggerContext(TriggerHandlerType triggerHandlerType) throws TriggerHandlerException {
    switch (triggerHandlerType) {
        case DASHBOARD_HANDLER:
            triggerContext = new TriggerContext(new DashboardTriggerHandler());
            return triggerContext;
        case COMPONENT_HANDLER:
            triggerContext = new TriggerContext(new ComponentTriggerHandler());
            return triggerContext;
        case WIDGET_HANDLER:
            triggerContext = new TriggerContext(new WidgetTriggerHandler());
            return triggerContext;
        default:
            LOGGER.error(MIS_CONFIGURED_REQUEST_IS_PROVIDED);
            throw new TriggerHandlerException(TRIGGER_HANDLER_TYPE_GIVEN_IS_NOT_CONFIGURED_IN_THE_LIST_OF_TRIGGER_HANDLERS);

    }

}

有人可以帮助我增强此代码 - 我可以使其更通用并避免圈复杂度并遵循 SOLID 原则以及一些设计模式

3 个答案:

答案 0 :(得分:1)

我认为你的意思是“使代码更具动态性”,而你的问题来自于使用对象作为基元。

您的枚举对象应该包含要实例化的类型,而不是打开枚举对象:

enum TriggerHandlerType {
    DASHBOARD {
        @Override
        TriggerHandler create() {
            return new DashboardTriggerHandler();
        }
    },
    COMPONENT_HANDLER {
        //...
    };

    abstract TriggerHandler create();
}
然后

getTriggerContext可以调用create()来实例化处理程序:

private static TriggerContext getTriggerContext(TriggerHandlerType triggerHandlerType) throws TriggerHandlerException {
    return new TriggerContext(triggerHandlerType.create());
}

答案 1 :(得分:0)

我不确定整体设计结构,但可以用枚举上的newHandler()方法替换开关。

private static TriggerContext getTriggerContext(TriggerHandlerType triggerHandlerType)
    throws TriggerHandlerException
{
    return new TriggerContext(triggerHandlerType.newHandler());
}

在枚举中,would implement每种类型的方法枚举为

enum TriggerHandlerType {
    DASHBOARD_HANDLER
    {
        Handler newHandler() { return new DashboardHandler(); }
    },
    ...;
    abstract Handler newHandler();
}

答案 2 :(得分:0)

您可以使用配置图:

// All your triggers classes should implement this interface
interface TriggerHandler {}

// For example:
public static class DashboardTriggerHandler implements TriggerHandler {
}

// Create your configuration
static Map<TriggerHandlerType, Class> contexts;
static {
    contexts = new HashMap<>();
    contexts.put(TriggerHandlerType.DASHBOARD_HANDLER, DashboardTriggerHandler.class);
    contexts.put(TriggerHandlerType.COMPONENT_HANDLER, ComponentTriggerHandler.class);
    contexts.put(TriggerHandlerType.WIDGET_HANDLER, WidgetTriggerHandler.class);
}

// Return your instance through reflection
public static TriggerContext getTriggerContext(TriggerHandlerType triggerHandlerType) throws TriggerHandlerException, IllegalAccessException, InstantiationException {

    Class className = contexts.get(triggerHandlerType);

    if (className == null) {
        throw new TriggerHandlerException();
    }

    return new TriggerContext((TriggerHandler)className.newInstance());
}