Следующий дизайн Java позволяет расширять объект без изменения его интерфейса для клиентов. Объект может реализовывать дополнительные интерфейсы расширения. Клиенты могут запросить у объекта расширения интерфейсов, которые он реализует. Я читал об этом в сообщении в блоге, но мои навыки Google не смогли найти сообщение в блоге снова. Я не защищаю достоинства этого дизайна. Я просто хочу найти сообщение в блоге.
Например, представьте модель домена для транспортных средств. Каждый объект транспортного средства реализует этот интерфейс:
public interface Extendable {
/**
* Asks the object if it provides the extension.
*
* @param extensionInterface
* requested extension
* @return object implementing the requested extension, or {@code null} if
* not available.
*/
<T> T queryExtension(Class<T> extensionInterface);
}
Самолеты с неподвижным крылом имеют поверхности управления полетом, а другие типы транспортных средств - нет. Определите интерфейс для элемента поверхностей управления:
public interface ControlSurfaces {
String getAilerons();
String getElevator();
String getRudder();
}
Класс самолетов с фиксированным крылом обеспечивает расширение ControlSurfaces
:
public class FixedWingAircraft extends Vehicle {
@SuppressWarnings("unchecked")
public <T> T queryExtension(Class<T> extensionInterface) {
if (ControlSurfaces.class.equals(extensionInterface)) {
return (T) new ControlSurfacesImpl();
}
return null;
}
}
Предположим, что модель домена является моделью анемичного домена , поэтому сервисный объект отвечает за сохранение объектов транспортного средства в постоянное хранилище. Служба должна запросить у транспортного средства дополнительные интерфейсы, которые также должны быть сохранены.
public class VehicleServiceImpl {
private VehicleDao vehicleDao;
private ControlSurfacesDao controlSurfacesDao;
public void save(Vehicle vehicle) {
vehicleDao.save(vehicle);
ControlSurfaces controlSurfaces = vehicle.queryExtension(ControlSurfaces.class);
if (controlSurfaces != null) {
controlSurfacesDao.save(vehicle, controlSurfaces);
}
}
}