【问题标题】:Why is decorator a structural pattern and chain of responsibility isn't?为什么装饰器是一种结构模式而责任链不是?
【发布时间】:2019-01-24 00:29:20
【问题描述】:

为什么装饰器是一种结构模式而责任链不是?

这两者之间的唯一区别是,一个无论如何都会传递,而另一个将由一个对象处理。

这种差异如何使一种模式成为结构模式和另一种行为模式?

【问题讨论】:

  • 装饰器模式基本上包装了一个已经存在的类,然后向它添加一些功能。我想这使它具有结构性。责任链就是将一个类的实现委托给另一个实现,这是行为上的。
  • @Tim Decorator 模式也使用委托。 stackoverflow.com/questions/13389544/…
  • 根据装饰者模式的维基百科页面,我没有看到委托是委托者模式的主要角色。
  • @Tim 我在两个地方看到了“委托”这个词。对于责任链页面,我没有看到任何内容。
  • 是的,委派正是责任链的意义所在。也许装饰器确实将行为从它包装的类委托给已经存在的类。

标签: design-patterns


【解决方案1】:

“一个无论如何传递,而另一个将由一个对象处理”的差异并不是决定是结构性的还是行为性的。

结构模式(根据 Gof)

关心如何组合类和对象以形成更大的 结构。结构模式使用继承来组成接口 或实现。

行为模式(根据 Gof)

关注算法和职责分配 对象之间。

在装饰器与链的情况下,区别似乎是学术上的,但事实仍然是装饰器符合结构的定义。

Chain 也使用链表,但列表项不是通过继承相关的,但列表是关于分配或承担责任的。

这是根据 GoF 的回复,但我不认为模式的新学生花时间在这种情况下的区别上浪费太多时间,尤其是考虑到最终产品的相似性!

【讨论】:

    【解决方案2】:

    似乎结构模式是设计模式的杂项。所以问题实际上是关于为什么责任链是一种行为模式,而装饰器不是。

    责任链和装饰器在一方面不同,装饰器总是遍历链中的所有对象,而责任链由其中一个对象处理并停止链。这使得责任链成为一种从众多行为中选择一种行为的机制。装饰器并不是要从众多行为中选择任何一种行为,这使得它不是一种行为模式。而且由于它也不是一种创造模式,所以它必须被归类为一种结构模式。

    【讨论】:

      猜你喜欢
      • 2019-05-11
      • 1970-01-01
      • 2020-08-23
      • 2011-04-12
      • 2010-10-19
      • 1970-01-01
      • 2015-08-24
      • 2011-12-28
      • 2021-07-21
      相关资源
      最近更新 更多