Так вот моя загадка. Я программирую инструмент, который должен работать на старых версиях нашего приложения. У меня есть код приложения, но я не могу изменить ни один из классов. Чтобы извлечь информацию из нашей базы данных, у меня есть своего рода DTO, который заполняется Hibernate. Он использует объект данных для версии 1.0 нашего приложения, хитро названный DataObject. Ниже приведен класс DTO.
public class MyDTO {
private MyWrapperClass wrapper;
public MyDTO(DataObject data) {
wrapper = new MyWrapperClass(data);
}
}
DTO создается с помощью запроса Hibernate следующим образом:
select new com.foo.bar.MyDTO(t1.data) from mytable t1
Теперь нужно немного логики поверх объекта данных, поэтому я создал для него класс-оболочку. Обратите внимание, что DTO хранит экземпляр класса-оболочки, а не исходный объект данных.
public class MyWrapperClass {
private DataObject data;
public MyWrapperClass(DataObject data) {
this.data = data;
}
public String doSomethingImportant() { ... version-specific logic ... }
}
Это хорошо работает, пока мне не нужно работать над версией 2.0 нашего приложения. Теперь DataObject в двух версиях очень похожи, но не одинаковы. Это привело к появлению различных подклассов MyWrapperClass, которые реализуют свои собственные doSomethingImportant (), зависящие от версии. Все еще в порядке. Но как myDTO создает соответствующий MyWrapperClass для конкретной версии? Hibernate, в свою очередь, создает экземпляр MyDTO, поэтому я не могу @Autowire зависимостью в Spring.
Я хотел бы повторно использовать MyDTO (и мои десятки других DTO) для обеих версий инструмента, без дублирования класса. Не повторяйся и все такое. Я уверен, что есть очень простой шаблон, который мне не хватает, который бы помог. Есть предложения?