组合模式(Composite)

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

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

查看所有标签

猜你喜欢:

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

老二非死不可

老二非死不可

方三文 / 机械工业出版社 / 2013-12 / 39.00

关于投资 价值投资者为啥都买茅台? 怎样识别好公司与坏公司? 做空者真的罪大恶极吗? 国际板对A股会有什么影响? 波段操作,止损割肉到底靠不靠谱? IPO真的是A股萎靡不振的罪魁祸首吗? 关于商业 搜狐的再造战略有戏吗? 新浪如何焕发第二春? 百度的敌人为什么是它自己? 我为什么比巴菲特早两年投资比亚迪? 民族品牌这张牌还靠谱......一起来看看 《老二非死不可》 这本书的介绍吧!

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

Markdown 在线编辑器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换