2017-09-25 11 views
0

私はインターフェイスインターフェイス分離原則 - Javaの

interface XXXCommandHandler(){ 
    void parse(String something); 
    String response(); 
    String additionalResponse(); 
} 
  1. を持ってXXXCommandHandlerを実装するクラスのいくつかは)(additionalResponseを実装していません。私はいくつかのadditionalResponseを実装していないので、私がnullを返すように強制しています
  2. 、その後の解析呼び出しXXXCommandHandler
  3. を実装するクラスを取得するためにApplicationContextManager.getInstance()。getBeansOfType(XXXCommandHandler.class)を使用して応答し、additionalResponse
  4. 私は、次の

    1. の代わりに、additionalResponseを実装declaire additionalResponseデフォルトの方法として、およびnullを返し/またはそれがオプションなどを返却し、それを上書きすることはありませんクラスにnullを返すと考えることができます

    additionalResponseメソッドを実装しているクラスについて説明します。

  5. 醜い方法: - XXXCommandHandlerParserすなわち

    インタフェースXXXCommandHandlerParserを拡張additionalResponse方法で)additionalResponse

  6. を解析し、レスポンス方式とXXXCommandHandlerAddtionalresponse(2つの異なるインタフェースをXXXCommandHandlerParser()を作成し実装していないすべてのクラスでnullを返します(){

    void parse(String something); 
        String response(); 
    
    } 
    

    インターフェースXXXCommandHandlerAddtionalresponse() がXXXCommandHandlerParser {

    01を拡張
    String additionalResponse(); 
    } 
    
  7. しかし、私は#3をすれば、私は ApplicationContextManager.getInstance()。getBeansOfType(XXXCommandHandlerAddtionalresponse.class)を変更する必要がありました。

  8. #4の場合、additionalResponseを実装していないクラスまたはXXXCommandHandlerAddtionalresponseを実装していないクラスは取得されません。

どのようなエレガントな方法について考えることができますか?

+0

@Mena - 私はあなたのインタフェースがデフォルトの方法では1番のオプションだと思います。 –

+0

"インタフェースがあります。XXXCommandHandler(){...' "...これは有効なJavaではありません。 –

+0

ハリー、読みやすくするためにコードを適切にフォーマットする必要があります –

答えて

0

それは解決策は、よりエレガントですが、どこへ行くか(少なくとも)1つのより多くの方法がある好みの問題です:

  1. トップレベルのインタフェースを作成します。interfaceA

  2. はにinterfaceAを拡張余分なメソッドでinterfaceB

  3. は、インスタンスがキャストよりinterfaceBある場合

  4. タイプinterfaceAの豆を収集し、余分なメソッドを呼び出します。

デフォルトの実装にオプションの値を返すよりも、それほどエレガントではないかもしれません。

0

「additionalResponse」の内容によっては、基本インターフェイスで宣言したり、nullを返す実装(または空のString?)を基本実装に追加して、実際の実装をそれぞれのサブクラスに追加することができます。

現実世界の問題では、通常、別の開発者が計画している実装に驚くかもしれないし、それをバグにつなげる方法で使用するかもしれないかどうか考えることを助けます。

あなたが気に入って欲しいのなら、Decorator Patternが候補かもしれません。

サブクラス化は、通常、パターン・ガウスが、正当化されているよりも頻繁に使用されるので、目立たなくなりますが、それは人々が知っていると期待していることです。それは@Zsolt Vが推奨する解決策になる(擬似コードとしてここに - コンパイルされない場合があります)。

Collection<XXXCommandHandler> baseHandlers = ApplicationContextManager.getInstance() 
    .getBeansOfType(XXXCommandHandler.class).values(); 
for (XXXCommandHandler baseHandler: basehHandlers) { 
    baseHandler.parse(something); 
    baseHandler.response(); 

    if (baseHandler instanceof XXXCommandHandlerAddtionalresponse.class) { 
    XXXCommandHandlerAddtionalresponse additionalResponseHandler 
     = (XXXCommandHandlerAddtionalresponse) baseHandler: 
    additionalResponseHandler.additionalResponse(); 
    } 
} 
0

私もお手伝いをしようとします。私の視点からは、インタフェースを作成したり、Responseクラスを直接指名したり、Stringの代わりに返すことができます。さらに、メソッドsupports supportsAdditionalResponseを追加して、それをチェックしてからadditionalResponseを取得することができます。 additionalResponseがサポートされていない場合は、getAdditionalResponseメソッドUnsupportedOperationExceptionをスローします。

私の見解からは、インフラストラクチャを公開しているため、ApplicationContextManager.getInstance()。getBeansOfType(XXXCommandHandler.class)も良いことではありません。可能であれば、List getCommandHandlers()メソッドを追加する方がよいでしょう。

public interface Response { 
    String getResponse(); 

    default Boolean supportsAdditionalResponse() { 
     return false; 
    }; 

    default String getAdditionalResponse() { 
     throw new UnsupportedOperationException(); 
    } 
    } 


    public class HttpResponse implements Response { 
    private String response; 

    public HttpResponse(String response) { 
     this.response = response; 
    } 

    @Override 
    public String getResponse() { 
     return response; 
    } 

    } 

    public interface CommandHandler { 
    void parse(String command); 
    Response getResponse(); 
    } 

    public class HttpCommandHandler implements CommandHandler { 
    private final Response response; 

    public HttpCommandHandler(Response response) { 
    this.response = response; 
    } 

    @Override 
    public void parse(String command) { 
    //do smth 
    } 

    @Override 
    public Response getResponse() { 
     return response; 
    } 
} 
関連する問題