设计模式之组合模式(Composite)
场景
树结构,文件系统
具体请看https://www.cnblogs.com/chenssy/p/3299719.html
每个句子都由单词组成,而单词又由字符组成。这些对象中的每一个都是可打印的,它们可以在它们之前或之后打印一些东西,例如句子总是以句号结束,而字总是在它之前有空格
组合中的对象声明接口
public abstract class LetterComposite {
private List<LetterComposite> children = new ArrayList<>();
public void add(LetterComposite letterComposite){
children.add(letterComposite);
}
public int count(){
return children.size();
}
protected void printThisBrfor(){}
protected void printThisAfter(){}
public void print(){
printThisBrfor();
for (LetterComposite l:children ) {
l.print();
}
printThisAfter();
}
}
字母
public class Letter extends LetterComposite{
private char c;
public Letter(char c) {
this.c = c;
}
@Override
protected void printThisBrfor() {
System.out.print(c);
}
}
单词
public class Word extends LetterComposite {
public Word(List<Letter> letters){
for (Letter letter : letters){
this.add(letter);
}
}
@Override
protected void printThisBrfor() {
System.out.print(' ');
}
}
句子
public class Sentence extends LetterComposite {
public Sentence(List<Word> words) {
for (Word word : words) {
this.add(word);
}
}
@Override
protected void printThisAfter() {
System.out.print('.');
}
}
测试
public class APP {
static 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);
}
static 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);
}
@Test
public void letterTest(){
LetterComposite orcs = messageFromOrcs();
LetterComposite elves = messageFromElves();
orcs.print();
elves.print();
}
}
类图
适用性
使用复合图案时
- 您想要表示对象的部分整体层次结构
- 您希望客户能够忽略对象和单个对象的组合之间的差异。客户端将统一处理复合结构中的所有对象