【问题标题】:Design Patterns Chain of Resposibility Vs Decorator责任链与装饰器的设计模式
【发布时间】:2011-04-12 21:13:33
【问题描述】:

责任链模式与装饰者模式有何不同?

【问题讨论】:

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


【解决方案1】:

我通常认为装饰器是对某事的“添加”,而责任链更像是处理某事。

比较这两种模式(除了苹果和橙子)最大的区别是责任链可以在任何时候杀死链。

将装饰器视为一个分层单元,其中每一层总是进行前/后处理。责任链更像是一个链表,一般1个东西处理。

责任链模式允许多个事物来处理一个事件,但它也让它们有机会在任何时候终止链。

【讨论】:

  • 你能告诉我在什么情况下需要责任链或装饰器......?
  • @Mind:就像 Nix 说的,苹果和橙子。而是写下你应该做的事情,我们可以从那里帮助你。
  • 我很困惑,为什么你一开始还要比较这些看似非常不同的范式?
  • @Marcus 假设您有一个日志记录功能。现在,您需要在此处装饰该函数,因为无论它成功还是失败,您都想执行日志记录。另一方面,假设您想通过某种构建器创建一个对象。 builder 函数可以通过链来设置,这样对象的整个构建就可以失败,以防万一有些东西坏了。很可能你真的不想在最后恢复到原来的状态。即链模式允许断裂。装饰器没有。 PS:(我知道我晚了大约十年,但我不妨添加示例)。
【解决方案2】:

场景:

考虑一个服务请求(通常是对您的笔记本电脑的管理员访问权限),该请求需要得到您的经理、总监和副总裁的批准。在这种情况下,装饰器模式的行为就像在每个级别都只有来自每个级别的 cmets,最后你会得到一个输出。因此,经理会说“已批准并转发”,同样,主管会说“好的,已批准并转发”,最后是副总裁“已批准”。您的最终输出将是所有 3 个 cmets 的组合。

注意:无论您的请求是否被批准,链条都不会中断。

在责任链中,在每个阶段,个人都有权批准或拒绝。如果在任何级别请求被拒绝,那么您的请求不会进入下一个级别,而是以结果终止。希望这会有所帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 2019-05-11
    • 2012-09-04
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    相关资源
    最近更新 更多