我正在寻找一种替代装饰器模式使其更加动态的方法。举一个简单的例子,假设我们有以下代码:
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<Resource> getChildren();
}
class File implements Readable {
...
}
class Zip implements Listable, Wrapper {
public Zip(Readable source) { ... }
}
从下面可以看出,Zip并没有直接实现Readable接口,但是它正在读取的资源实现了该接口。假设我们构造一个zip文件:
Zip zip = new Zip(new File());
我不想(也无法)将所有接口堆叠来扩展彼此(例如,Listable 扩展 Readable),也不能构造所有对象来实现所有功能,因为并非所有功能都相互关联,您希望能够通过包装它们来即时“装饰”对象。
我确定这是一个常见的问题,但是否有解决方案?使用“Wrapper”接口,您当然可以探测资源链以检查功能,但我不确定这是否是一个明智的方法。
更新:
问题如上所述,不是所有功能都相关,因此您无法建立漂亮的接口层次结构。例如,假设您有这个任意的新功能:
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()并找出所有功能。在即时回复中没有清晰的解决方案,因此也许递归检查是一个不错的选择?
Zip
不能实现Readable
? - Aaron Digulla