gpt4 book ai didi

java - 面向对象编程 : adding features on the fly

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:18:46 29 4
gpt4 key购买 nike

我正在寻找装饰器模式的替代方案,以使其更具动态性。作为一个简单的例子,假设我们有这样的代码:

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());

我不想(也不能)堆叠所有接口(interface)以相互扩展(例如 Listable extends Readable),我也不能构造所有对象来实现所有功能,因为并非所有功能都相互关联,您希望能够通过包装来即时“装饰”对象。

我确定这是一个常见问题,但是否有解决它的模式?使用“Wrapper”界面,您当然可以探查资源链以根据需要检查功能,但我不确定这是否是一种明智的方法。

更新

问题如上所述,并非所有功能都相关,因此您无法构建良好的接口(interface)层次结构。例如,假设您有这个任意的新功能:

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() 并找出所有功能。即时回复中没有明确的解决方案,所以也许递归检查毕竟是一个不错的选择?

最佳答案

我想你要找的是mixins

链接的维基百科页面有一个很好的支持它们的 OOP 语言列表。还是您特别喜欢 Java?

关于java - 面向对象编程 : adding features on the fly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15654654/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com