设计模式-组合模式

目的:

将对象组合成树结构以表示部分整体层次结构。 组合可以使客户统一对待单个对象和组合对象。

程序示例:

每个句子由单词组成,单词又由字符组成。这些对象中的每一个都是可打印的,它们可以在它们之前或之后打印一些内容,例如句子始终以句号结尾,单词始终在其前面有空格。

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.

类图:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值