2017-02-16 24 views
1

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

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

public interface ClientOperation <T>{ 
     T doAction(SomeObject someObject); 
    } 

И это интерфейс, который будет выполнять функцию обратного вызова ClientOperation

public interface Executor { 

    <T> T doTask(ClientOperation<T> operation); 
    } 

Класс реализации Executor

public class ExecutorImpl implements Executor { 



    public <T> T doTask(ClientOperation<T> operation) { 
     T response = null; 
     /* 
      DO SOMETHING FIRST - USED BY ALL CLASSES 
     */ 

     try { 
      response = operation.doAction(someObject); 
     } catch (SomeException e) { 
      /* 
       DO SOME SERIOUS STUFF 
      */ 

     } catch (Exception e) { 
      LOGGER.error(e.getMessage()); 
      throw new SystemException(e.getMessage(), e); 
     } 

     return response; 
    } 
} 

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

public void addSomething(final Secret secret) 
      throws UnauthorizedActionException, InvalidSecretKeyException { 

      executorService.doTask(new ClientOperation<Response>() { 
       public Response doAction(SomeObject someObject) { 

       //DO STUFF ON THIS 
        return template.write(secret.getPath(), 
          secret.getSecretValue()); 

       } 
      }); 


} 

ответ

1

Я хочу изучить различные способы реализации этого.

Ваш подход кажется совершенно прекрасным. Я хотел бы сделать еще один шаг и сделать ввод (например, SomeObject) общим, чтобы ClientOperation мог работать с различными типами ввода.

public interface ClientOperation <T,S>{ 
     T doAction(S someObject); 
} 

Альтернативный подход будет использовать Template Method шаблон, где ClientOperation преобразуется к классу abstract с abstractdoAction метода и конкретного finaldoTask метода, который вызывает doAction в try-catch блоке. Подклассы обеспечивают реализацию метода doAction. Недостатком этого подхода было бы то, что вы не можете распространяться ни на один другой класс.

+1

Отлично! Спасибо за ответ. Я также думаю, что метод шаблона также ограничивает конкретные подклассы одним методом реализации. –