Шаблон проектирования для вызова разных функций для разных экземпляров - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть такой код Java -

Sample obj;
if(obj instanceOf Class1) 
{
    method1(obj);
} else if(obj instanceOf Class2) 
{
    method2(obj);
} else if(obj instanceOf Class3) 
{
    method3(obj);
}

Class1 , Class2 и Class3 на самом деле DTO, и они являются потомками Sample , поэтому я не хочу писать бизнес логика в DTO.

Я хочу написать логику method1 , mehtod2 и method3 в другом классе. Есть ли шаблон дизайна для этого. Я использую пружину MVC.

По сути, я ищу не-Java-технику для вызова соответствующего, основанного на экземпляре, вместо проверки каждый раз с instanceOf.

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

Как насчет создания пользовательской аннотации для классов? Решает ли это вашу проблему с бизнес-логикой? Что-то вроде

@CustomMethodName(method="method1")
public class Class1{
 //..
}
@CustomMethodName(method="method2")
public class Class2{
 //..
}
@CustomMethodName(method="method3")
public class Class3{
 //..
}

После того, как вы получите название вашего метода с помощью

Class<?> aClass = Sample.class;
Annotation[] annotations = aClass.getAnnotations();
for(Annotation annotation : annotations){
    if(annotation instanceof CustomMethodName){
        CustomMethodName myAnnotation = (CustomMethodName) annotation;
        String methodName = myAnnotation.method();
        java.lang.reflect.Method method;
        try {
           method = obj.getClass().getMethod(methodName);// get method wherever you define them
           method.invoke(obj);//execute method
        } catch (SecurityException e) { ... }
          catch (NoSuchMethodException e) { ... }
     }
}
0 голосов
/ 30 апреля 2018

Не очень хорошо, но давайте попробуем

  • Создать интерфейс

    открытый интерфейс Процессор {

    void process(Simple simple);
    

    }

  • Запись реализации для каждого подкласса Sample // Class1 Processor Открытый класс Class1Processor реализует Процессор {

    @Override
    public void process(Simple simple) {
        System.out.println("Class1 processing completed");
    }
    

    } // Class2 Processor открытый класс Class2Processor реализует процессор {

    @Override
    public void process(Simple simple) {
        System.out.println("Class2 processing completed");
    }
    

    }

  • Процессор фабричного класса открытый класс ProcessorFactory {

    private static final Map<Class<? extends Simple>, Processor> LOOKUP = new HashMap<>();
    
    static {
        LOOKUP.put(Class1.class, new Class1Processor());
        LOOKUP.put(Class2.class, new Class2Processor());
    }
    
    public static <T extends Simple> Processor getProcessor(T obj) {
        return LOOKUP.get(obj.getClass());
    }
    

    }

  • и, наконец, основной класс public static void main (String [] args) {

    Simple class1 = new Class1();
    Simple class2 = new Class2();
    
    ProcessorFactory.getProcessor(class1).process(class1);
    ProcessorFactory.getProcessor(class2).process(class2);
    

    }

0 голосов
/ 30 апреля 2018

Определите интерфейс method и реализуйте общий интерфейс в Class1, Class2 и Class3 - делегируйте method1, method2 или method3, в зависимости от ситуации, в реализации в этих классах. Запрограммируйте на общий интерфейс.

obj.method();
...