2015-08-11 4 views
1

У меня есть дизайн дилемма, где:Дизайн дилеммы. Какой лучший дизайн?

  1. У меня есть действие пользовательского интерфейса на моей веб-странице, чтобы позволить пользователю выбрать тип из списка типов.

  2. Каждый тип определяется POJO. Мне нужно обернуть это POJO (для выбранного пользователем) в родительском классе и использовать его для выполнения действия.

  3. Каждый тип может привести к другому действию.

Как создать родительский класс для поддержки любого типа, который пользователь выбирает? Я хочу избежать проверки instanceof при использовании выбранного POJO позже в своем приложении.

+0

Создайте интерфейс для всех этих – SomeJavaGuy

+0

Да. Это как мой текущий дизайн. Но как мне избежать экземпляра позже? –

+0

Является ли POJO чистым объектом данных или является частью бизнес-логики? Или сформулированы иначе: Можете ли вы сделать POJO в объект команды и сделать с ним? – dhke

ответ

3

Какое решение лучше всего зависит от того, как вы определяете выбор в вашем пользовательском интерфейсе.

Самый простой способ определить возможные варианты - это перечисление. Если вы идете по этому маршруту, я бы предложил использовать EnumMap для сопоставления типа для действия или (при условии, что действия изменяются или должны быть созданы для каждого запроса) фабрикой действий.

Например:

EnumMap<Type, Class<Action>> typeToActionMap = new EnumMap<>(); 
typeToActionMap.put(Type.Large, LargeAction.class); 
typeToActionMap.put(Type.Medium, MediumAction.class); 
typeToActionMap.put(Type.Small, SmallAction.class); 

Выше я использую класс действия как своего рода фабрику. Если действия могут быть одиночными, вы можете сделать значение карты действием. Как @dhke предложил, вы можете использовать гуавы-х ClassToInstanceMap к для этого отображения:

ClassToInstanceMap<Action> actionTypeToAction = MutableClassToInstanceMap.create(); 
typeToActionMap.putInstance(LargeAction.class, new LargeAction(...)); 
typeToActionMap.putInstance(MediumAction.class, new MediumAction(...)); 

Если у вас уже есть уникальный тип для каждого выбора то вам просто нужно найти способ сделать отображение. Простой способ, чтобы ваши типы все реализовать общий интерфейс:

public interface ActionProvider { 

    Class<? extends Action> getActionClass(); 
+0

Действительно ли это необходимо ?. Учитывая, что у меня есть интерфейс для определения этих типов? –

+0

@ Priyanka.Patil На карте вместо этого может содержаться конкретный класс. 'Map , Class > ' – michaelsnowden

+0

Для добавления: также можно напрямую сопоставить исходный класс без перечисления, однако тогда нужно правильно обрабатывать иерархию типов. К счастью, это было сделано раньше (например, guava имеет [ClassToInstanceMap] (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/ClassToInstanceMap.html)) – dhke

0

Чтобы избежать instanceof, вы можете просто переопределить метод, который затем выполняет действие пользовательского интерфейса, которое вам нужно.

public void doAction(Type1 type) { //... } 
public void doAction(Type2 type) { //... } 

Этот подход может принимать несколько форм

interface Action { 
    void perform(); 
} 

public class ActionFactory { 
    public static Action getAction(Type1 type) { //... } 
    public static Action getAction(Type2 type) { //... } 
} 
+1

Как вам избежать 'instanceof' + cast * before * вы можете вызвать эти методы? Разрешение перегрузки основано на объявленном типе ... – dhke

+0

@dhke Я предположил, что конкретный класс известен. – michaelsnowden

1

Implement ActionRegistry.

class ActionRegistry { 
    private static Map<ActionType, AbstractAction> REGISTRY = ... 

    public static void registerAction(AbstractAction a) { 
     REGISTRY.put(a.getType(), a); 
    } 

    public static AbstractAction getAction(ActionType type) { 
     REGISTRY.get(type); 
    } 
} 

Затем, когда вы выбираете type в вашем пользовательском интерфейсе, вы можете сделать:

ActionRegistry.getAction(type).run(); 

Вы можете экспериментировать с AbstractAction, поэтому он будет автоматически регистрироваться в реестре, когда его подклассы инстанцируются.

Смежные вопросы