oop - 为什么我要使用责任链而不是装饰器?

标签 oop design-patterns decorator chain-of-responsibility

我正在阅读 Chain of Responsibility模式,我很难想象一个场景,当我更喜欢使用它而不是 decorator 时.

你觉得怎么样? CoR 有特殊用途吗?

最佳答案

您可以在任何时候打破链条,这一事实将责任链模式与装饰者模式区分开来。装饰器可以被认为是一次性执行,无需与其他装饰器进行任何交互。链中的链接可以被认为是一次执行一个链接,因为它们每个都依赖于前一个链接。

当您可以将程序概念化为由链接组成的链时,请使用责任链模式,其中每个链接都可以处理请求或将其传递到链上。

当我使用 Win32 API 时,有时需要使用它提供的 Hook 功能。 Hook Windows 消息大致遵循责任链模式。当您 Hook 诸如 WM_MOUSEMOVE 之类的消息时,您的回调函数将被调用。将回调函数视为链中的最后一个环节。链中的每个链接都可以决定是丢弃 WM_MOUSEMOVE 消息还是将其沿链向上传递到下一个链接。

如果在该示例中使用了装饰器模式,您将收到 WM_MOUSEMOVE 消息的通知,但您将无法阻止其他钩子(Hook)也处理它。

使用命令链模式的另一个地方是游戏引擎。同样,您可以 Hook 引擎函数、事件和其他内容。对于游戏引擎,您不想简单地添加功能。您想要添加功能并阻止游戏引擎执行其默认操作。

关于oop - 为什么我要使用责任链而不是装饰器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/747913/

相关文章:

java - 带参数的单例类

java - 如何对车辆进行分类——继承与接口(interface)

javascript - 使用基于实例的装饰器发布订阅者模式 'this' 始终未定义

c# - IoC、SRP 和组合——我是否创建了太多接口(interface)?

c# - 在单一方法中克隆派生类型

java - 有什么办法可以减少这些线路吗?

c++ - 如何在 C++ 中合并两个共享相同基类的类?

c++ - "Interface Object"模式。合理的?

python - 学习 Pyramid (python) 并且正在与 @view_config 装饰器作斗争。它应该开箱即用吗?

django - django 模板能否知道调用它的 View 是否具有 @login_required 装饰器?