首页 > 解决方案 > 设计模式如何在使用 List 时避免 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>

或者有没有一种更多态的方法?

标签: javadesign-patterns

解决方案


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

我会使用一个Language类,并在Dish类中保留 a Map<Locale,Description>(我会将Language类重命名为不那么容易混淆的名称,例如Description,因为它不代表一种语言,它代表某种语言的描述)。

现在你可以拥有一个

Description getDescription(Locale locale)

类中的方法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);
    }
}

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


推荐阅读