组合模式(Composite)

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

内容简介:将对象组合成树结构以表示 部分— 整体 层次结构。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)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Agile Web Development with Rails 4

Agile Web Development with Rails 4

Sam Ruby、Dave Thomas、David Heinemeier Hansson / Pragmatic Bookshelf / 2013-10-11 / USD 43.95

Ruby on Rails helps you produce high-quality, beautiful-looking web applications quickly. You concentrate on creating the application, and Rails takes care of the details. Tens of thousands of deve......一起来看看 《Agile Web Development with Rails 4》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具