2017-02-15 24 views
-2

Мы разрабатываем базовый компонент, для нескольких бизнес-сценариев мы разработали специальный код для каждого сценария. , мы хотим вызвать эту бизнес-логику пользовательского кода после выполнения моей основной бизнес-логики настраиваемым образом без изменения кода в основном компоненте.Java - существует ли шаблон проектирования для вызова пользовательской бизнес-логики кода после выполнения моей основной бизнес-логики

Есть ли какой-либо шаблон дизайна для этого сценария?

Мы используем Spring Framework, есть ли доступная функция init?

Пример кода:

Основной модуль:

Core.java

public String save (Map<String,String> map){ 
// my business logic here to insert into to core table 
} 

Пользовательский модуль:

Entity1Custom.java

public String customSave(Map<String,String> map){ 
// my custom save logic only for Entity1 
} 

Entity2Custom .java

public String customSave(Map<String,String> map){ 
// my custom save logic only for Entity2 
} 

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

+2

Необходимо написать код. Оставьте * шаблон дизайна *, который будет использоваться в стороне на данный момент. – CKing

+0

Вы можете посмотреть образец фабрики, но я согласен с написанием кода @CKing, который сначала решает вашу проблему и подбирает шаблон второй. – mba12

+1

Стандартный дизайн OO должен справиться с этим, не так ли? Поместите основную логику в абстрактный класс, который отбрасывает пользовательский код абстрактному методу. – Brick

ответ

0

Пример простой вещи, вы можете использовать (Java 8 примеров с методами по умолчанию, но вы можете легко адаптируются):

public interface BusinessProcessor { 

    default void doBefore() { 

    } 

    void doCoreBusiness(); 

    default void doAfter() { 

    } 
} 

public class MyCoreBusiness implements BusinessProcessor { 

    @Override 
    public void doCoreBusiness() { 
     // Do core business there 
    } 

} 

public class MyCustomExtendedBusiness extends MyCoreBusiness { 

    @Override 
    public void doBefore() { 
     // Do something before 
    } 

} 

Теперь, как объяснено в комментариях на ваш вопрос, нет никакой потребности конкретного шаблон дизайна для этого, концепция объекта достаточно. Будь проще.

0

Вот мой вариант, который похож на тот, что был @kjj, но избегает реализации по умолчанию на интерфейсе.

public class CoreLogic { 
    protected void doCoreLogic() { 
     // Core logic here 
    } 

    protected void doSpecificLogic { 
     // Leave this implementation empty in case 
     // some subclass doesn't need it. Alternatively, 
     // make it abstract (and the the class abstract too) 
     // to force subclasses to provide an implementation. 
    } 

    public void doAction { 
     doCoreLogic(); 
     doSpecificLogic(); // Works even if this method is abstract 
    } 
} 

public class SpecificLogic1 extends CoreLogic { 
    protected void doSpecificLogic() { 
     // Specific logic here. 
    } 
} 

Обратите внимание, что, как и другие также отметили, что это не так много «Паттерн», как только основные принципы ОО на работе.

+0

Я меняю код, если придумаю SpecificLogic2 в будущем, но я не делаю изменения кода – Pandian

+0

@Pandian Я не могу понять ваш комментарий? Если вы придумаете SpecificLogic2, тогда вы напишите новый подкласс CoreLogic и оставьте SpeicifcLogic1. Конечно, если вы придумаете новую логику, вам нужно написать код, который где-то записывает эту логику. – Brick

+0

@ Кирпич. Предположим, что у нас есть несколько классов SpecificLogic1, расширяет CoreLogic, какой будет выполняться метод doSpecificLogic() класса? – Pandian

0

Я планирую реализовать свой описанный выше сценарий в соответствии с подходом ниже. Пожалуйста, поделитесь, есть ли другой существующий шаблон подхода/дизайна, поддерживающий мой сценарий.

import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

/** 
* @author pandian 
* 
*/ 
public class Core { 

    public static void main(String[] arg) { 
     Core core = new Core(); 
     Map<Object, Object> obj = new HashMap<Object, Object>(); 
     core.create(obj); 
    } 

    public Map create(Map<Object, Object> obj) { 

     // TODO implement core business logic 
     System.out.println("Core Business Logic Completed"); 
     try { 
      obj = invokeAfter(obj); 
     } catch (SecurityException | IllegalArgumentException | ClassNotFoundException | InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { 
      e.printStackTrace(); 
     } 

     return obj; 
    } 

    public Map invokeAfter(Map<Object, Object> obj) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, 
      IllegalArgumentException, InvocationTargetException { 

     Class params[] = {}; 
     // TODO below list will be injected using spring configuration in 
     // configurable approach 
     List<String> afterClassNameList = new ArrayList<String>(); 
     afterClassNameList.add("Custom1"); 
     afterClassNameList.add("Custom2"); 

     if (!afterClassNameList.isEmpty()) { 
      for (String className : afterClassNameList) { 
       System.out.println("Class Name::" + className); 
       Class thisClass = Class.forName(className); 
       Object iClass = thisClass.newInstance(); 
       Method thisMethod = thisClass.getDeclaredMethod("create", params); 
       obj = (Map<Object, Object>) thisMethod.invoke(iClass, obj); 
      } 
     } 
     return obj; 
    } 
} 

class Custom1 { 
    public Map create(Map<Object, Object> obj) { 
    // TODO implement custom business logic 
    return obj; 
    } 
} 

class Custom2 { 
    public Map create(Map<Object, Object> obj) { 
    // TODO implement custom business logic  
    return obj; 
    } 
}