Java 设计模式 -- 组合模式

组合模式 : 允许你将对象组合成树形结构来表现 "整体/部分" 层次结构。组合能够让我们用一致的方式处理个别对象以及对象集合。

先来看一张图

demo01.png

图中所示的结构和树一样,有叶子节点也有根节点,我们如何能够将二者统一起来,像处理叶子节点一样处理根节点,或者说像处理根节点一样处理叶子节点。下面我们以一个简单的遍历来实现这种效果。首先,我们定义一个统一的父类。

public abstract class LessonModal {
    protected String name;

    public String getName() {
        return name;
    }

    public void print() {
        throw new UnsupportedOperationException();
    }

    public void add(LessonModal modal) {
        throw new UnsupportedOperationException();
    }

    public void remove(LessonModal modal) {
        throw new UnsupportedOperationException();
    }

    public LessonModal getChild() {
        throw new UnsupportedOperationException();
    }
}

由于叶子节点无法再添加子节点,所以在这里我们将 print(), get(), remove(), getChild() 方法设置默认抛出一个异常。这样的话,在继承的时候,根节点就重写这三个方法,而叶子节点只需要重写 print() 方法,其它都使用默认实现即可。

public class ScienceLesson extends LessonModal {

    private ArrayList<LessonModal> lessons = new ArrayList<>();

    public ScienceLesson() {
        this.name = "ScienceLesson";
    }

    @Override
    public void add(LessonModal modal) {
        lessons.add(modal);
    }

    @Override
    public void remove(LessonModal modal) {
        lessons.remove(modal);
    }

    @Override
    public void print() {
        System.out.println(getName());

        Iterator<LessonModal> modalIterator = lessons.iterator();
        while (modalIterator.hasNext()) {
            LessonModal modal = modalIterator.next();
            System.out.print("\t");
            modal.print();
        }
    }
}

print() 方法中我们仍然使用了迭代器。这是根节点的书写方式,下面再看看叶子节点的书写方式。

public class Biological extends LessonModal {

    public Biological() {
        this.name = "Biological";
    }

    @Override
    public void print() {
        System.out.println(getName());
    }
}

其它的几个类都采用以上这两种写法,根据自己的不同种类进行选择。可见,只要我们这么做,就可以对根节点和叶子节点进行统一的处理,不必区别对待。下面进行测试

public class Client {
    public static void main(String[] args) {
        LessonModal scienceLesson = new ScienceLesson();
        LessonModal biological = new Biological();
        LessonModal physical = new Physical();
        LessonModal chemical = new Chemical();
        LessonModal organicChemical = new OrganicChemical();
        LessonModal inorganicChemical = new InorganicChemical();

        chemical.add(organicChemical);
        chemical.add(inorganicChemical);

        scienceLesson.add(biological);
        scienceLesson.add(chemical);
        scienceLesson.add(physical);

        scienceLesson.print();
    }
}

输出结果

ScienceLesson
    Biological
    Chemical
        Organic Chemical
        Inorganic Chemical
    Physical
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容