リストを使用した場合のinstanceofを避けるために、どのようにパターンを設計

雄大:

あなたは各皿は、複数の言語(フランス語、英語、アラビア語、...)で利用可能であるべき料理でメニューを持っている想像してみてください。Dishクラスが持つリストが含まLanguageタイプのオブジェクトを。

class Dish { 
     List<Language> languages
     void addLanguage(Language lg){...}
}
class Language { getDescription(){}}

class French extends Language{}

class Menu {List<Dish> dishes }

どのように私は使用を避けるかinstance of、その料理のための特定の言語の記述を望むとき?

私は、各言語の皿クラスのgetメソッドのために定義する必要があります:getFrench()、getArabic()、..?

または私はそれがリストに維持し、リストをループすることによって、フランスのインスタンスをチェックしてから呼び出す必要がありgetDescription()、この上list object<language>

以上の多型アプローチの方法は何ですか?

彼らは次のとおりでした:

私はそれが言語ごとに別々のクラスを作成するには良いアイデアだとは思いません。結局のところ、すべてのこれらのクラスはまったく同じメソッドを持っています。

私は、単一の使用したいLanguageクラスを、そして内部のDishクラス私はしておこうMap<Locale,Description>(私は名前を変更したいLanguage以下のような混乱何かにクラスをDescription、それは言語を表していないので、それはいくつかの言語での記述を表します)。

今、あなたは持つことができます

Description getDescription(Locale locale)

あなたのメソッドDish渡されたの言語で料理の説明を返しますクラス、Locale

次のような標準のJDKクラスを使用して好む必要がありますjava.util.Locale代わりにするときのカスタムクラスの可能性。

コメントを検討し、そのうちのいくつかに同意した後、私は削除提案MapするDescriptionクラス。

class Dish 
{ 
      Description description = new Description ();

      void addDescription(Locale locale, String text)
      {
          description.addText(locale,text);
      }

      String getDescription(Locale locale) 
      {
          return description.getText(locale);
      }
 }

class Description 
{
    Map<Locale,String> descriptions = new HashMap<>();

    public void addText(Locale locale,String text) 
    {
        descriptions.put(locale,text);
    }

    public void getText(Locale locale) 
    {
        return descriptions.get(locale);
    }
}

また、言語の特定の記述を検索することに注意する必要がありMap、それを検索するよりも効率的であるListO(1)ルックアップ時間HashMapO(n)内のルックアップ時List)。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=172493&siteId=1