我正在寻找装饰器模式的替代方案,以使其更具动态性.举一个简单的例子,假设我们有以下代码:
interface Resource {
public String getName();
}
interface Wrapper extends Resource {
public Resource getSource();
}
interface Readable extends Resource {
public InputStream getInputStream();
}
interface Listable extends Resource {
public List getChildren();
}
class File implements Readable {
...
}
class Zip implements Listable, Wrapper {
public Zip(Readable source) { ... }
}
如您所见,Zip不会直接实现Readable,但是会从中读取资源.假设我们构造一个zip:
Zip zip = new Zip(new File());
我不想(也不能)堆叠所有接口以相互扩展(例如Listable extended Readable),也不能构造所有对象来实现所有功能,因为并非所有功能都相互关联以便通过包装来“装饰”物体.
我敢肯定这是一个普遍的问题,但是有解决的办法吗?当然,使用“包装器”界面,您可以探查资源链,以检查是否需要功能,但是我不确定这是否是理智的方法.
更新
如上所述,问题在于,并非所有功能都相关,因此您无法构建良好的接口层次结构.例如,假设您具有此任意新功能:
interface Rateable extends Resource {
public int getRating();
}
class DatabaseRateable implements Rateable, Wrapper {
public DatabaseRateable(Resource resource) { ... }
}
如果您运行:
Resource resource = new DatabaseRateable(new Zip(new File));
生成的资源“丢失”了所添加的所有功能(可读,可列出…).
如果有Rateable扩展说Listable,那将是荒谬的.
再一次,我可以递归检查resource.getSource()并找出所有功能.在即时答复中,没有明确的解决方案,所以也许递归检查毕竟是一个不错的选择?