Я пытаюсь создать класс GraphBot, который может отвечать на различные вопросы о связанном графе, такие как длина пути, кратчайший путь между двумя вершинами, количество путей, проходящих через данную вершину и т. Д.
Я бы хотел иметь возможность добавлять новые вопросы без изменения кода внутри бота, он отвечает только за получение вопроса, делегируя такому другому алгоритму решение вопроса с использованием графа, связанного с ботом, и возвращая ответить.
Так что-то вроде этого:
public class GraphBot {
private Graph graph;
public GraphBot(Graph graph) {
this.graph = graph;
}
public Answer ask(Question question) {
// delegate somehow to answer the question, providing the graph
// return an Answer object encapsulating the answer
}
}
public interface Answer {
public toPrintableOutput();
}
public interface Question {
// question methods go here... this is what I'm having trouble with
}
Проблема в том, что у вопросов есть связанные условия или параметры. Например, вопрос «длина пути» между «A» и «B» имеет тип вопроса («длина пути»), который задают все вопросы, а также параметры «A» и «B». Для сравнения, вопрос «пути, проходящие через вершину» будет иметь только параметр «C», представляющий вершину.
Я не могу придумать, как представить единый интерфейс, чтобы можно было легко расширить систему, чтобы обрабатывать множество разных вопросов с разными числами и типами параметров. У меня мог быть QuestionSolver, который был связан с каждым Вопросом, и в этом случае не имело бы значения, если бы каждый Вопрос имел разные атрибуты, так как QuestionSolver мог утверждать, что вопрос имеет допустимый тип, но это потребовало бы сопоставления Вопроса с QuestionSolver где-нибудь, что потребует обновления всякий раз, когда вводится новый вопрос.
Каков наиболее расширяемый способ внедрения этой системы, чтобы новые вопросы не требовали тонны изменений в нагрузках различных классов? На самом деле я хочу иметь возможность создать класс, реализующий Вопрос, и, возможно, создать класс, который может решить этот вопрос, а затем автоматически установить GraphBot для обработки этого вопроса.