java - 设计模式如何在使用 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>
?
或者有没有一种更多态的方法?
解决方案
我认为为每种语言创建一个单独的类不是一个好主意。毕竟,所有这些类都有完全相同的方法。
我会使用一个Language
类,并在Dish
类中保留 a 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);
}
}
您还应该注意,在 a 中搜索特定语言的描述Map
比在 a 中搜索更有效List
( aO(1)
中的查找时间与 a 中的HashMap
查找O(n)
时间List
)。
推荐阅读
- scala - 使用名称对 Scala 枚举器进行排序
- coldfusion - CFClient 调用 CFC http://domain/cfc/users.cfc 时出错:未找到
- c# - 从加密文本中获取 IV 以用于解密方法
- mule - 在 DataWeave 中映射嵌套地图时出现问题
- go - 如何附加到二维切片
- jquery - 如何将原始选择框的名称传递给 selectize.js 加载方法?
- c# - 需要将 XML 内容添加到 HttpResponseMessage C# 的正文中
- php - Laravel 5.6,电子邮件未使用 sendmail 驱动程序在服务器上发送
- php - 如何使用存储在数据库中并在新页面中回显的 PHP 代码?
- java - 使用 apache camel 读写 excel 文档