内容简介:将对象组合成树结构以表示 部分— 整体 层次结构。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)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Introduction to the Design and Analysis of Algorithms
Anany Levitin / Addison Wesley / 2006-2-24 / USD 122.00
Based on a Based on a new classification of algorithm design techniques and a clear delineation of analysis methods, "Introduction to the Design and Analysis of Algorithms" presents the subject in a c......一起来看看 《Introduction to the Design and Analysis of Algorithms》 这本书的介绍吧!