2017-08-26 14 views
1

デザインパターンが新しくなりました。異なる入力パラメータタイプとデータ抽出アルゴリズムのデザインパターン

私の質問は以下のケースでどのようなパターンを使用しますか?

interface UserExtractorService { 
    String getUser(XXXX); 
    default validate(File file); 
} 

class AExtractorService { 
    public String getUser(String url) { 
      validate(downloadfromWeb(url)); 
     return getFromWeb(url); 
    } 
} 

class BExtractorService { 
    public String getUser(File) { 
      validate(file); 
      parsingFromFile(File); 
     return parsingFromFile(File); 
    } 
} 

class Client { 

    public void GetUsers(String key) { 
     userExtractorService.getUser(key); 
    } 

    public void GetUsers(File file) { 
     userExtractorService.getUser(file); 
    } 
} 

同様の動作をする必要があるため、AExtractorとBExtractorをグループ化したいと考えています。

+0

クラスがインタフェースを実装している次のように私たちは本質的になる1つのなどのユーザーデータのソースごとサブクラス(ウェブ、ファイル)のJavagetUser方法の一例を持っているでしょうか? getUser()メソッドはオーバーロードされたバージョンです。両方がインタフェースで公開されていますか? –

答えて

0

1は、ユーザがケースを詳しく見て取る場合、柔軟である必要があり、設計の2つの側面があることは明らかである:

  1. getUserメソッドのパラメータの型が可能にあるケースではStringであり、他のケースではFileである。
  2. ユーザーデータを抽出するためのメカニズムは、ソースによってはつまり、ウェブのURLから抽出したり、ファイル

ポイント1UserExtractorServiceを持つことができるジェネリック/テンプレート機能を使用して取り組むことができます異なります型パラメータまたはgetUserメソッドは型パラメータを持つことができます。クラスまたは関数のタイプパラメータは、getUser関数の入力パラメータタイプを表し、UserExtractorServiceの実装をインスタンス化している間にクライアントによって定義されます。

ポイント2は、Template method design patternを使用して対処できます。これはC++のテンプレートクラスおよびメソッドとは異なります。テンプレートメソッドパターンは、動作中のアルゴリズムのプログラムスケルトンを定義し、いくつかのステップをサブクラスに委譲する動作デザインパターンです。

これをコードに翻訳すると、getUserメソッドがテンプレートメソッドになります。次にgetUserで呼び出されるString extractUserData(T source)という抽象メソッドを定義します。この抽象メソッドはサブクラスによって実装され、特定のソースからデータを抽出するアルゴリズムを含みます。

abstract class UserExtractorService<T> { 
    public final String getUser(T source) { 
     validate(source); 
     return extractUserData(source); 
    } 

    protected abstract String extractUserData(T source); 
    protected abstract void validate(File f); 
} 
+0

@puxism答えを受け入れてくれてありがとう。あなたの問題を解決するのに役立つ回答をupvoteすることを忘れないでください。 :) – CKing

関連する問題