所以我的问题是你有很多条件要检查,如果条件你有多行代码。我想消除它并使用继承代替。对于每个if语句,我将使用一个单独的类来处理它。这更像是命令模式的衍生物,而不是命令模式本身。
我有一个接口,它只包含一个定义我希望它实现的任务的方法。我有一个实现该接口的抽象类,包含一个静态映射和静态方法来添加值并检索任务。我指定的类将扩展此处理程序类。
这是我的方案。
我发送一个字符串作为参数来获取特定的翻译器。让我们说sinhala或泰米尔语或英语。在这些翻译器的每个实现中,我将在静态块中的处理程序类中向地图添加必要的值。基本上在类加载时添加它们。
以下是我的代码。
命令界面
public interface Command {
LanguageTranslator getLangTranslator();
}
处理程序摘要类
public abstract class Handler implements Command {
private static Map<String, Command> map = new HashMap<>();
public static void AddToMap(String key, Command command){
map.put(key,command);
}
public static LanguageTranslator getTranslator(String value) throws Exception {
if (!(map.containsKey(value))){
throw new LanguageNotFoundException("Translator not found");
}else {
return map.get(value).getLangTranslator();
}
}
}
僧伽罗语翻译
public class SiCommand extends Handler {
static {
Handler.AddToMap("1",new SiCommand());
}
@Override
public LanguageTranslator getLangTranslator() {
return new SiTranslator();
}
}
泰米尔语翻译
public class TiCommand extends Handler {
static {
Handler.AddToMap("2",new TiCommand());
}
@Override
public LanguageTranslator getLangTranslator() {
return new TiTranslator();
}
}
英文翻译
public class EnCommand extends Handler {
static {
Handler.AddToMap("3",new EnCommand());
}
@Override
public LanguageTranslator getLangTranslator() {
return new EnTranslator();
}
}
演示
RowTranslator rowTranslator = Handler.getTranslator("2");
问题
由于在课程加载期间所有值都已分配给地图,因此这些是我的问题
使用这样的静态块是一种很好的做法吗?
我想消除之前提到的if条件的使用。通过使用此方法,当有人想要添加新的if条件时,您只需创建一个新的类扩展处理程序并实现它。因此,外部用户不需要知道 Command 子类的内部处理。输出只是一个翻译。这是一个很好的方式吗?有哪些更好的选择?应该调整什么?
注意
此外,我将严格关注打开/关闭原则