下面的Java设计允许在不更改对象到客户端的接口的情况下扩展对象。该对象可以实现附加的扩展接口。客户端可以向对象请求它实现的扩展接口。我在一篇博客文章中读到了这件事,但我的谷歌技能再次未能找到这篇博客文章。我并不是在鼓吹这种设计的优点。我只想找到那篇博文。
例如,设想一个用于运输车辆的域模型。每个vehicle对象都实现这个接口:
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;
}
}假设域模型是一个anemic domain model,因此服务对象负责将车辆对象保存到持久存储中。服务必须向车辆请求扩展接口,该扩展接口也必须保存。
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);
}
}
}发布于 2009-06-28 22:12:53
这是“扩展接口”模式的Java实例,如Schmidt,Stal,Rohnert和Buschmann,Wiley,2000所著的“面向模式的软件体系结构”第2卷(POSA-2)中所述。
发布于 2009-06-28 21:50:17
你是说using proxies to expose an interface at runtime吗?很抱歉,你的问题令人困惑。我看不出提出贫血域模型有什么帮助。
https://stackoverflow.com/questions/1055833
复制相似问题