组合模式(Composite)

栏目: 后端 · 发布时间: 7年前

内容简介:将对象组合成树结构以表示 部分— 整体 层次结构。Composite允许客户端统一处理单个对象和对象组合。

目的

将对象组合成树结构以表示 部分— 整体 层次结构。Composite允许客户端统一处理单个对象和对象组合。

说明

每个句子都由单词组成,单词又由字符组成。这些对象中的每一个都是可打印的,它们可以在它们之前或之后打印一些内容,例如句子总是以句号结束,单词在它之前总是有空格。

简而言之

复合模式允许客户以统一的方式处理单个对象。

维基百科说

在软件工程中,复合模式是分区设计模式。复合模式描述了一组对象的处理方式与单个对象实例相同。复合的意图是将对象“组合”成树结构以表示 部分 — 整体 层次结构。通过实现复合模式,客户可以统一处理单个对象和组合。

源码示例

以我们上面的句子为例。这里我们有基类和不同的可打印类型

<b>public</b> <b>abstract</b> <b>class</b> LetterComposite {
  <b>private</b> List<LetterComposite> children = <b>new</b> ArrayList<>();
  <b>public</b> <b>void</b> add(LetterComposite letter) {
    children.add(letter);
  }
  <b>public</b> <b>int</b> count() {
    <b>return</b> children.size();
  }
  <b>protected</b> <b>void</b> printThisBefore() {}
  <b>protected</b> <b>void</b> printThisAfter() {}
  <b>public</b> <b>void</b> print() {
    printThisBefore();
    <b>for</b> (LetterComposite letter : children) {
      letter.print();
    }
    printThisAfter();
  }
}

<b>public</b> <b>class</b> Letter <b>extends</b> LetterComposite {
  <b>private</b> <b>char</b> c;
  <b>public</b> Letter(<b>char</b> c) {
    <b>this</b>.c = c;
  }
  @Override
  <b>protected</b> <b>void</b> printThisBefore() {
    System.out.print(c);
  }
}

<b>public</b> <b>class</b> Word <b>extends</b> LetterComposite {
  <b>public</b> Word(List<Letter> letters) {
    <b>for</b> (Letter l : letters) {
      <b>this</b>.add(l);
    }
  }
  @Override
  <b>protected</b> <b>void</b> printThisBefore() {
    System.out.print(<font>" "</font><font>);
  }
}

<b>public</b> <b>class</b> Sentence <b>extends</b> LetterComposite {
  <b>public</b> Sentence(List<Word> words) {
    <b>for</b> (Word w : words) {
      <b>this</b>.add(w);
    }
  }
  @Override
  <b>protected</b> <b>void</b> printThisAfter() {
    System.out.print(</font><font>"."</font><font>);
  }
}
</font>

然后我们有一个信使来传递信息

<b>public</b> <b>class</b> Messenger {
  LetterComposite messageFromOrcs() {
    List<Word> words = <b>new</b> ArrayList<>();
    words.add(<b>new</b> Word(Arrays.asList(<b>new</b> Letter('W'), <b>new</b> Letter('h'), <b>new</b> Letter('e'), <b>new</b> Letter('r'), <b>new</b> Letter('e'))));
    words.add(<b>new</b> Word(Arrays.asList(<b>new</b> Letter('t'), <b>new</b> Letter('h'), <b>new</b> Letter('e'), <b>new</b> Letter('r'), <b>new</b> Letter('e'))));
    words.add(<b>new</b> Word(Arrays.asList(<b>new</b> Letter('i'), <b>new</b> Letter('s'))));
    words.add(<b>new</b> Word(Arrays.asList(<b>new</b> Letter('a'))));
    words.add(<b>new</b> Word(Arrays.asList(<b>new</b> Letter('w'), <b>new</b> Letter('h'), <b>new</b> Letter('i'), <b>new</b> Letter('p'))));
    words.add(<b>new</b> Word(Arrays.asList(<b>new</b> Letter('t'), <b>new</b> Letter('h'), <b>new</b> Letter('e'), <b>new</b> Letter('r'), <b>new</b> Letter('e'))));
    words.add(<b>new</b> Word(Arrays.asList(<b>new</b> Letter('i'), <b>new</b> Letter('s'))));
    words.add(<b>new</b> Word(Arrays.asList(<b>new</b> Letter('a'))));
    words.add(<b>new</b> Word(Arrays.asList(<b>new</b> Letter('w'), <b>new</b> Letter('a'), <b>new</b> Letter('y'))));
    <b>return</b> <b>new</b> Sentence(words);
  }

  LetterComposite messageFromElves() {
    List<Word> words = <b>new</b> ArrayList<>();
    words.add(<b>new</b> Word(Arrays.asList(<b>new</b> Letter('M'), <b>new</b> Letter('u'), <b>new</b> Letter('c'), <b>new</b> Letter('h'))));
    words.add(<b>new</b> Word(Arrays.asList(<b>new</b> Letter('w'), <b>new</b> Letter('i'), <b>new</b> Letter('n'), <b>new</b> Letter('d'))));
    words.add(<b>new</b> Word(Arrays.asList(<b>new</b> Letter('p'), <b>new</b> Letter('o'), <b>new</b> Letter('u'), <b>new</b> Letter('r'), <b>new</b> Letter('s'))));
    words.add(<b>new</b> Word(Arrays.asList(<b>new</b> Letter('f'), <b>new</b> Letter('r'), <b>new</b> Letter('o'), <b>new</b> Letter('m'))));
    words.add(<b>new</b> Word(Arrays.asList(<b>new</b> Letter('y'), <b>new</b> Letter('o'), <b>new</b> Letter('u'), <b>new</b> Letter('r'))));
    words.add(<b>new</b> Word(Arrays.asList(<b>new</b> Letter('m'), <b>new</b> Letter('o'), <b>new</b> Letter('u'), <b>new</b> Letter('t'), <b>new</b> Letter('h'))));
    <b>return</b> <b>new</b> Sentence(words);
  }
}

它可以用作

LetterComposite orcMessage = <b>new</b> Messenger().messageFromOrcs();
orcMessage.print(); <font><i>// Where there is a whip there is a way.</i></font><font>
LetterComposite elfMessage = <b>new</b> Messenger().messageFromElves();
elfMessage.print(); </font><font><i>// Much wind pours from your mouth.</i></font><font>
</font>

适用场景

  • 您想要表示对象的 部分 — 整体 层次结构。
  • 您希望客户端忽略对象组合和单个对象之间的差异。客户端将统一处理复合结构中的所有对象。

以上所述就是小编给大家介绍的《组合模式(Composite)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

因计算机而强大

因计算机而强大

[美]西摩 佩珀特 Seymour Papert / 梁栋 / 新星出版社 / 2019-1 / 38

本书有两个中心主题—— 孩子可以轻松自如地学习使用计算机; 学习使用计算机能够改变他们学习其他知识的方式。 (前苹果公司总裁 约翰·斯卡利) 最有可能带来文化变革的就是计算机的不断普及。 计算机不仅是一个工具,它对我们的心智有着根本和深远的影响。 计算机不仅帮助我们学习 ,还帮助我们学习怎样学习。 计算机是一种调解人与人之间关系的移情对象。 一个数学的头脑......一起来看看 《因计算机而强大》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具