java 动态 功能_Java-面向对象的编程:动态添加功能

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值