Проблема
Я пытаюсь создать приложение, в котором класс объектов может реализовывать некоторые операции из общего пула доступных операций.Конечная цель - не допускать дублирования кода и максимально соблюдать законы ООП.
Более подробно, я пытаюсь создать поисковую систему с использованием Lucene.Lucene
использует много индексов.Я уже реализовал простую структуру, в которой различные объекты индекса наследуют методы родительского класса.Проблема в том, что какой бы метод ни реализован в этом родительском классе, он автоматически становится доступным для использования всеми подклассами.Я хочу дать пользователю возможность определить, хочет ли он выполнить поиск по фразе, поиск по термину или что-либо еще, доступное для этого определенного индекса.Суть в том, что некоторые индексы не должны иметь возможность проводить поиск по фразе, например.
Первые мысли
Я думал о реализации чего-то близкого к Composite pattern,
как описано GoF.Я бы реализовал операции поиска (например, поиск по термину, поиск по фразе) как примитивные операции, реализующие некоторый класс Component , и позже добавил бы эти примитивные объекты к объекту Composite .Объект Composite будет реализовывать тот же класс Component , что и примитивы.
public abstract class Index {
public Index(String indexPath) {
// Constructor using the information provided by the subclass
}
public void phraseSearch(...) {
// Do the operation
}
public void termSearch(...) {
// Do the operation
}
public void categorySearch(...) {
// Do the operation
}
}
public class ReviewIndex extends Index {
public ReviewIndex() {
super("./review_index/");
}
}
public class TipIndex extends Index {
public TipIndex() {
super("./tip_index/");
}
}
Ожидаемый результат
Класс ReviewIndex
shouldn 'не может выполнять поиск по категориям, но может
выполнять операции поиска по фразам и termSearch.Соответственно, TipIndex
класс
должен иметь возможность выполнять некоторые методы родительского класса.
Заключительные мысли
Я знаю, что в моем решении нет дублирования кода, но естьбесполезные методы, генерируемые каждый раз, когда создается новый объект индекса.Спасибо всем заранее!
PS Если вы думаете, что шаблон Composite - это путь, каким образом вы фактически добавите примитивные объекты в составной класс и каким образомВы вызываете их, когда это необходимо?