本帖最后由 大蓝鲸小蟀锅 于 2018-12-25 11:15 编辑
意图
将对象组合成树结构以表示部分整体层次结构。 组合允许客户端处理单个对象和组合的对象一致。
解释
真实例子
每个句子都是由字符组成的单词组成。 这些对象中的每一个都是可打印的,它们可以在它们之前或之后打印出一些东西,因为句子总是以完全停止的方式结束,而且在它之前总是有空格 字面意思 组合模式使客户能够以统一的方式对待各个对象。 维基百科 在软件工程中,组合模式是分区设计模式。 组合模式描述了一组对象的处理方式与对象的单个实例相同。 组合的意图是将对象“组合”成树结构以表示部分整体层次结构。 实现组合模式使客户能够一致地处理单个对象和对象组。 编程例子 以我们上面的例子为例。在这里,我们有不同类型的基类,可打印的字符 public abstract class LetterComposite { private List<LetterComposite> children = new ArrayList<>(); public void add(LetterComposite letter) { children.add(letter); } public int count() { return children.size(); } protected void printThisBefore() {} protected void printThisAfter() {} public void print() { printThisBefore(); for (LetterComposite letter : children) { letter.print(); } printThisAfter(); } } public class Letter extends LetterComposite { private char c; public Letter(char c) { this.c = c; } @Override protected void printThisBefore() { System.out.print(c); } } public class Word extends LetterComposite { public Word(List<Letter> letters) { for (Letter l : letters) { this.add(l); } } @Override protected void printThisBefore() { System.out.print(" "); } } public class Sentence extends LetterComposite { public Sentence(List<Word> words) { for (Word w : words) { this.add(w); } } @Override protected void printThisAfter() { System.out.print("."); } } Then we have a messenger to carry messages public class Messenger { LetterComposite messageFromOrcs() { List<Word> words = new ArrayList<>(); words.add(new Word(Arrays.asList(new Letter('W'), new Letter('h'), new Letter('e'), new Letter('r'), new Letter('e')))); words.add(new Word(Arrays.asList(new Letter('t'), new Letter('h'), new Letter('e'), new Letter('r'), new Letter('e')))); words.add(new Word(Arrays.asList(new Letter('i'), new Letter('s')))); words.add(new Word(Arrays.asList(new Letter('a')))); words.add(new Word(Arrays.asList(new Letter('w'), new Letter('h'), new Letter('i'), new Letter('p')))); words.add(new Word(Arrays.asList(new Letter('t'), new Letter('h'), new Letter('e'), new Letter('r'), new Letter('e')))); words.add(new Word(Arrays.asList(new Letter('i'), new Letter('s')))); words.add(new Word(Arrays.asList(new Letter('a')))); words.add(new Word(Arrays.asList(new Letter('w'), new Letter('a'), new Letter('y')))); return new Sentence(words); }
LetterComposite messageFromElves() { List<Word> words = new ArrayList<>(); words.add(new Word(Arrays.asList(new Letter('M'), new Letter('u'), new Letter('c'), new Letter('h')))); words.add(new Word(Arrays.asList(new Letter('w'), new Letter('i'), new Letter('n'), new Letter('d')))); words.add(new Word(Arrays.asList(new Letter('p'), new Letter('o'), new Letter('u'), new Letter('r'), new Letter('s')))); words.add(new Word(Arrays.asList(new Letter('f'), new Letter('r'), new Letter('o'), new Letter('m')))); words.add(new Word(Arrays.asList(new Letter('y'), new Letter('o'), new Letter('u'), new Letter('r')))); words.add(new Word(Arrays.asList(new Letter('m'), new Letter('o'), new Letter('u'), new Letter('t'), new Letter('h')))); return new Sentence(words); } } 然后它可以用作 LetterComposite orcMessage = new Messenger().messageFromOrcs(); orcMessage.print(); // Where there is a whip there is a way. LetterComposite elfMessage = new Messenger().messageFromElves(); elfMessage.print(); // Much wind pours from your mouth. 适用范围 使用组合模式时 真实例子 权威信息
|