设计模式如何在使用List时避免instanceOf

maj*_*tic 6 java design-patterns

想象一下,你有菜单,每道菜应该有多种语言(法语,英语,阿拉伯语......).本Dish类包含一个列表Language类型的对象.

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

class French extends Language{}

class Menu {List<Dish> dishes }
Run Code Online (Sandbox Code Playgroud)

instance of如果想要对该菜肴的特定语言进行描述,我该如何避免使用?

我应该为每种语言定义一个类中的get方法:getFrench(),getArabic(),..?

或者我应该将其保留在列表中并通过循环列表检查法语的实例,然后调用getDescription()list object<language>

或者有更多的多态方法吗?

Era*_*ran 7

我不认为为每种语言创建一个单独的类是个好主意.毕竟,所有这些类都将具有完全相同的方法.

我会使用一个单独的Language类,并且在Dish类中我将保留一个Map<Locale,Description>(我将该Language类重命名为不那么令人困惑的东西Description,因为它不代表语言,它代表某种语言的描述).

现在你可以拥有一个

Description getDescription(Locale locale)
Run Code Online (Sandbox Code Playgroud)

在你的Dish类中的方法,它将以传递的语言返回菜的描述Locale.

您应该更喜欢使用标准JDK类,例如尽可能使用java.util.Locale自定义类.

考虑到的意见,并同意其中的一些,我建议去掉MapDescription类.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

您还应该注意,在a中搜索特定于语言的描述Map比在a中搜索它List(O(1)查找时间与a中的查找时间)HashMap相比更有效.O(n)List

  • @Torben好点.我同意如果Dish不需要维护本地化地图可能会更好.将本地化放在Description类中可以避免这种情况.Dish将包含单个Description实例,并将调用description.getDescription(locale)以获取特定于语言环境的描述.我仍然不想为每种语言创建一个单独的类. (2认同)