【问题标题】:BlockingQueue decorator that logs removed objects记录已删除对象的 BlockingQueue 装饰器
【发布时间】:2011-02-22 06:48:29
【问题描述】:

我有一个BlockingQueue 实现,用于生产者-消费者情况。我想装饰这个队列,以便记录从中取出的每个对象。我知道简单的实现会是什么样子:只需实现BlockingQueue 并在所有方法都委托给它的构造函数中接受BlockingQueue。还有另一种我想念的方式吗?也许是图书馆?有回调接口的东西?

【问题讨论】:

    标签: java decorator design-patterns blockingqueue


    【解决方案1】:

    您可能希望考虑的替代方案是dynamic proxies。这使您可以使用反射式 API 来处理在给定接口上发出的请求 - 将所有调用委托给底层实现将非常简单,同时如果方法名称与其中一个 take 方法匹配,则添加一些日志记录逻辑。

    这种方法的缺点是它给所有方法调用增加了一些额外的开销(对于一般用途来说几乎可以忽略不计,尽管如果在性能关键部分使用这应该是一个黄色标志),并且代码可以结束起来看起来很麻烦。最终,您所做的是定义与您在帖子中描述的完全相同的行为,只是您不需要明确编写每个委托方法,而是提供一种通配符实现。

    【讨论】:

    【解决方案2】:

    我认为创建一个类来扩展BlockingQueue 接口的相关实现类并覆盖remove 方法和其他需要的方法会更简单。

    编辑

    如果 OP 使用BlockingQueue 的多个实现,则创建包装器是一种更好的实现,但它会对 所有 操作和其他小问题造成小的性能影响。

    我的观点是扩展队列类是包装它的替代方法。是否是更好的选择取决于具体情况。

    【讨论】:

    • 我们谈论的是同一个界面吗? Java BlockingQueue 接口中没有accept 方法。
    • BlockingQueue 是一个接口 - 鉴于此,我认为 OP 建议的组合方法比继承更好,因为这意味着它们可以交换不同的 BlockingQueue 实现。
    猜你喜欢
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 2014-04-12
    • 2013-07-28
    相关资源
    最近更新 更多