返回介绍

1.5 复合模式

发布于 2025-01-04 00:44:54 字数 1622 浏览 0 评论 0 收藏 0

复合模式(Composite Pattern) 下,一组对象与单个对象的多个实例在处理方式上是相同的。该模式常用于对象层级。通常,对于层级中的叶(leaf)或复合(composite)节点,一个或多个方法的调用方式应该是相同的。在这种情况下,复合节点通常会调用它每一个子节点的同一命名方法。

1.5.1 范例

下面探讨一下复合模式的一个范例,在 LeafComposite 对象上调用 toString()

CompositeClasses

在 Java 中, Component 类是非常重要的,因为它提供了叶节点与复合节点所用的类型。在 Groovy 中,由于 duck-typing,所以不再需要用它来完成这种用途,但该类依然非常有用,可以在叶节点与复合节点间放置常见的行为。

根据目标,我们将构建以下的层级:

CompositeComponents

代码如下:

abstract class Component {
  def name
  def toString(indent) {
    ("-" * indent) + name
  }
}

class Composite extends Component {
  private children = []
  def toString(indent) {
    def s = super.toString(indent)
    children.each { child ->
      s += "\\n" + child.toString(indent + 1)
    }
    s
  }
  def leftShift(component) {
    children << component
  }
}

class Leaf extends Component { }

def root = new Composite(name: "root")
root << new Leaf(name: "leaf A")
def comp = new Composite(name: "comp B")
root << comp
root << new Leaf(name: "leaf C")
comp << new Leaf(name: "leaf B1")
comp << new Leaf(name: "leaf B2")
println root.toString(0)

结果输出如下:

root
-leaf A
-comp B
--leaf B1
--leaf B2
-leaf C

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文