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>?
或者有更多的多态方法吗?
我不认为为每种语言创建一个单独的类是个好主意.毕竟,所有这些类都将具有完全相同的方法.
我会使用一个单独的Language类,并且在Dish类中我将保留一个Map<Locale,Description>(我将该Language类重命名为不那么令人困惑的东西Description,因为它不代表语言,它代表某种语言的描述).
现在你可以拥有一个
Description getDescription(Locale locale)
Run Code Online (Sandbox Code Playgroud)
在你的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);
}
}
Run Code Online (Sandbox Code Playgroud)
您还应该注意,在a中搜索特定于语言的描述Map比在a中搜索它List(O(1)查找时间与a中的查找时间)HashMap相比更有效.O(n)List
| 归档时间: |
|
| 查看次数: |
121 次 |
| 最近记录: |