2017-02-16 14 views
1

try catchなどの一部の機能や、アプリケーションで使用されるその他の一般的な機能を再利用したかったのです。私はこのアプローチがOKかどうか疑問に思っていました。または、他にも素晴らしい方法があれば。私はこれをどのように実装できるかについてさまざまな方法を学びたいと思う。関数を再利用するときに使用するパターン

これは、サービスが使用するコールバック関数です。

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

私はこれをどのように実装できるかについてさまざまな方法を学びたいと思います。

あなたのアプローチは完全に素晴らしいと思われます。私はそれをさらに一歩進めて、ClientOperationが異なる入力タイプで動作できるように、入力(つまりSomeObject)も一般的なものにします。

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

代替アプローチはClientOperationabstractdoAction方法及びtry-catchブロック内doActionを呼び出しコンクリートfinaldoTask方法でabstractクラスに変換されTemplate Methodパターンを使用することであろう。サブクラスはdoActionメソッドの実装を提供します。このアプローチの欠点は、他のどのクラスからも拡張できないことです。

+1

素晴らしい!フィードバックをお寄せいただきありがとうございます。私はまた、テンプレートメソッドも具体的なサブクラスを1つの実装方法に限定していると考えています。 –

関連する問題