天天看点

【学习笔记】设计模式-组合模式前言组合模式树类型基类树干子类树叶子类结语

前言

本文来自《Head Fist 设计模式》一书的实例,这里仅仅是个人笔记记录

组合模式

组合模式让我们能用树形方式创建对象的结构,其中树里面包含了组合以及个别的对象。

【学习笔记】设计模式-组合模式前言组合模式树类型基类树干子类树叶子类结语

故公共基类的方法是一致,区分在于要不要实现

树类型基类

包含所有的方法

package composite_pattern;

public abstract class Tree {

    public abstract  String getName();

    public void add(Tree mTree){
        throw new UnsupportedOperationException();
    }

    public Tree getChild(int position){
        throw new UnsupportedOperationException();
    }

    public boolean hasTreeLeaf(){
        throw new UnsupportedOperationException();
    }

    public boolean hasTreeTrunk() {
        throw new UnsupportedOperationException();
    }
}
           

上述的方法实现了,但是需要子类进行重写

树干子类

package composite_pattern;

import java.util.ArrayList;
public class TreeTrunk extends Tree {

    private ArrayList<Tree> mlist = new ArrayList<>();

    @Override
    public String getName() {
        return TreeTrunk.class.getSimpleName();
    }

    @Override
    public void add(Tree mTree) {
        mlist.add(mTree);
    }

    @Override
    public Tree getChild(int position) {
        return mlist.get(position);
    }

    @Override
    public boolean hasTreeTrunk() {
        return true;
    }

    @Override
    public boolean hasTreeLeaf() {
        return true;
    }
}
           

树叶子类

叶子属于最终节点,故不需要add(),getChild等方法

package composite_pattern;

public class TreeLeaf extends Tree {

    @Override
    public String getName() {
        return TreeLeaf.class.getSimpleName();
    }

    @Override
    public boolean hasTreeTrunk() {
        return false;
    }

    @Override
    public boolean hasTreeLeaf() {
        return true;
    }
}
           

结语

感觉这种类似菜单-子菜单设计的树状模型还是挺常见的

继续阅读