Если я правильно понимаю ваш вопрос, вам нужен динамический шаблон Service Locator, в котором вы хотите выполнить, как и когда требуется, даже если во время выполнения.Это означает, что если есть новый символ и есть реализация для оператора, он должен работать.Я говорю о базовой строке вашего следующего кода.
public double eval(String symbol, double operand1, double operand2) {
return OperatorRegistry.get(symbol).calculate(operand1, operand2);
}
Мое предложение будет поддерживать такую карту.
Map<String (Symbol), OperatorService(Operator Impl)> symbolOpServiceMap
Должен быть метод load, который будет загружаться каждый разнезависимо от того, является ли новый символ или нет.Я предлагаю сохранить другой файл XML или свойства, который будет иметь реализацию символа и класса OperatorService.Если вы распространяете свой jar, распространяйте jar вместе с внешним файлом xml, json или файлом свойств, чтобы все службы оператора были загружены во время выполнения.Это означает, что вы обеспечиваете гибкость в том, что статическая и динамическая служба будут загружаться всегда, и вы сможете выполнить следующий код:
OperatorRegistry.get(symbol).calculate(operand1, operand2);
Чтобы сделать его более чистым, вы должны иметь следующую структуру.
public double eval(String symbol, double operand1, double operand2) {
loadAllOperatorServices();// <= This method will always be invoked and it //will read from xml, json file based upon the number of entries for symbol and //its corresponding implementation.
return OperatorRegistry.get(symbol).calculate(operand1, operand2);
}
Надеюсь, что это может быть полезно, другие старшие члены могут пролить больше света на этот дизайн.