Однако, это не кажется элегантным и было интересно, если есть лучший путь.
Это верно. Это нарушает принцип Open-Closed. Класс должен быть открыт для расширения, но закрыт для модификации. Вы также правы, когда говорите, что вам нужен общий объект.Вот что вы можете сделать:
Создание интерфейса загрузчика
public interface Loader<T> {
public String load(T t);
}
Создать загрузчик для загрузки из файла
public class FileLoader implements Loader<File> {
public String load(File f) {
//load from file
}
}
Создать загрузчик для загрузки из Url
public class UrlLoader implements Loader<Url> {
public String load(URL r) {
//load from url
}
}
Создать класс, который работает на данных
class DataOperator<T> {
Loader<T> loader;
public SomeClient(Loader<T> loader) {
this.loader = loader;
}
public void operate(T inputSource) {
String data = loader.load(inputSource);
//operate on the data
}
}
Клиентский код может затем использовать выше API, как показано ниже:
DataOperator<File> fileDataOperator = new DataOperator<>(new FileLoader());
fileDataOperator.operate(new File("somefile.txt"));
DataOperator<URL> urlDataOperator = new DataOperator<>(new UrlLoader());
urlDataOperator.operate(new URL("http://somesite.com"));
Вы могли бы думать, что это очень много классов для решения простой задачи. Тем не менее, это фактически встроено в хорошо известный принцип проектирования Open-Closed. Обратите внимание, как вы контролируете, какой метод используется для загрузки данных, создавая экземпляр соответствующего класса. Еще одно преимущество заключается в том, что вы можете решить, какой метод использовать в runtime
, создав Factory
, который вводит пользователя и создает соответствующий конкретный подкласс. Это упрощенная версия Strategy pattern.
Отказ от ответственности: Образцы кода, представленные выше, не были проверены на ошибки компиляции, так как у меня нет Java
.
Это нарушает принцип * Open-Closed *. Ваш класс должен быть изменен для каждого нового источника ввода. – CKing
Нет, вы можете просто расширить класс с помощью новой 'overload (NewInputSourceType)' overload – CupawnTae
Но вы не получите того преимущества, что сможете решить во время выполнения, с каким источником загрузить данные с помощью этого подхода. Перегруженные методы разрешаются во время компиляции. – CKing