目的:
将对象组合成树结构以表示部分整体层次结构。 组合可以使客户统一对待单个对象和组合对象。
程序示例:
每个句子由单词组成,单词又由字符组成。这些对象中的每一个都是可打印的,它们可以在它们之前或之后打印一些内容,例如句子始终以句号结尾,单词始终在其前面有空格。
1.创建组装总接口
public abstract class LetterComposite{
private final 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();
children.forEach(LetterComposite::print);
printThisAfter();
}
}
2.具体实现类
//字母
public class Letter extends LetterComposite{
private final char character;
public Letter(char character) {
this.character = character;
}
@Override
protected void printThisAfter() {
System.out.print(character);
}
}
//单词
public class Word extends LetterComposite{
public Word(List<Letter> letters) {
letters.forEach(this::add);
}
@Override
protected void printThisBefore() {
System.out.print(" ");
}
public Word(char... letters) {
for (char letter : letters) {
this.add(new Letter(letter));
}
}
}
//句子
public class Sentence extends LetterComposite{
public Sentence(List<Word> words) {
words.forEach(this::add);
}
@Override
protected void printThisAfter() {
System.out.print(".");
}
}
3.消息携带
public class Messenger{
LetterComposite messageFromOrcs() {
ArrayList<Word> words = new ArrayList<>();
words.add(new Word('W', 'h', 'e', 'r', 'e'));
words.add(new Word('t', 'h', 'e', 'r', 'e'));
words.add(new Word('i', 's'));
words.add(new Word('a'));
words.add(new Word('w', 'h', 'i', 'p'));
words.add(new Word('t', 'h', 'e', 'r', 'e'));
words.add(new Word('i', 's'));
words.add(new Word('a'));
words.add(new Word('w', 'a', 'y'));
return new Sentence(words);
}
LetterComposite messageFromElves() {
List<Word> words = Arrays.asList(new Word('M', 'u', 'c', 'h'),
new Word('w', 'i', 'n', 'd'),
new Word('p', 'o', 'u', 'r', 's'),
new Word('f', 'r', 'o', 'm'),
new Word('y', 'o', 'u', 'r'),
new Word('m', 'o', 'u', 't', 'h'));
return new Sentence(words);
}
}
测试
LetterComposite elves = new Messenger().messageFromElves();
LetterComposite messageFromOrcs = new Messenger().messageFromOrcs();
elves.print();//Much wind pours from your mouth.
messageFromOrcs.print();//Where there is a whip there is a way.
类图: