【发布时间】:2011-02-22 06:48:29
【问题描述】:
我有一个BlockingQueue 实现,用于生产者-消费者情况。我想装饰这个队列,以便记录从中取出的每个对象。我知道简单的实现会是什么样子:只需实现BlockingQueue 并在所有方法都委托给它的构造函数中接受BlockingQueue。还有另一种我想念的方式吗?也许是图书馆?有回调接口的东西?
【问题讨论】:
标签: java decorator design-patterns blockingqueue
我有一个BlockingQueue 实现,用于生产者-消费者情况。我想装饰这个队列,以便记录从中取出的每个对象。我知道简单的实现会是什么样子:只需实现BlockingQueue 并在所有方法都委托给它的构造函数中接受BlockingQueue。还有另一种我想念的方式吗?也许是图书馆?有回调接口的东西?
【问题讨论】:
标签: java decorator design-patterns blockingqueue
您可能希望考虑的替代方案是dynamic proxies。这使您可以使用反射式 API 来处理在给定接口上发出的请求 - 将所有调用委托给底层实现将非常简单,同时如果方法名称与其中一个 take 方法匹配,则添加一些日志记录逻辑。
这种方法的缺点是它给所有方法调用增加了一些额外的开销(对于一般用途来说几乎可以忽略不计,尽管如果在性能关键部分使用这应该是一个黄色标志),并且代码可以结束起来看起来很麻烦。最终,您所做的是定义与您在帖子中描述的完全相同的行为,只是您不需要明确编写每个委托方法,而是提供一种通配符实现。
【讨论】:
BlockingQueue,因此性能并不是什么大问题。本文有一个使用动态代理进行日志记录的示例:ibm.com/developerworks/java/library/j-jtp08305.html
我认为创建一个类来扩展BlockingQueue 接口的相关实现类并覆盖remove 方法和其他需要的方法会更简单。
编辑
如果 OP 使用BlockingQueue 的多个实现,则创建包装器是一种更好的实现,但它会对 所有 操作和其他小问题造成小的性能影响。
我的观点是扩展队列类是包装它的替代方法。是否是更好的选择取决于具体情况。
【讨论】:
BlockingQueue 接口中没有accept 方法。