内容简介:将对象组合成树结构以表示 部分— 整体 层次结构。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
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》 这本书的介绍吧!