替代If条件并将其替换为继承

时间:2016-09-26 05:27:30

标签: oop inheritance design-patterns hashmap if-case

所以我的问题是你有很多条件要检查,如果条件你有多行代码。我想消除它并使用继承代替。对于每个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");

问题

由于在课程加载期间所有值都已分配给地图,因此这些是我的问题

  1. 使用这样的静态块是一种很好的做法吗?

  2. 我想消除之前提到的if条件的使用。通过使用此方法,当有人想要添加新的if条件时,您只需创建一个新的类扩展处理程序并实现它。因此,外部用户不需要知道 Command 子类的内部处理。输出只是一个翻译。这是一个很好的方式吗?有哪些更好的选择?应该调整什么?

  3. 注意

    此外,我将严格关注打开/关闭原则

0 个答案:

没有答案