组合模式,网上的各种专业术语搞得人,审美疲劳,其实通俗易懂的理解就是,让使用者对单独对象还是对组合对象使用都是一致的,组合模式是以树形结构的表示,组合模式和装饰模式有相似点,只是他们的应用场景是不一样的,以下代码举例演示:


package com.oop.demo1;

/**
 * 抽象出家族抽象类
 * @author Liudeli
 *
 */
public abstract class Family {

    protected String name;

    public Family(String name) {
        this.name = name;
    }

    public abstract void add(Family component);

    public abstract void remove(Family component);

    public abstract void display(int depth);

}
package com.oop.demo1;

/**
 * 在组合中,属于叶节点,叶节点没有子节点
 * @author Liudeli
 *
 */
public class Leaf extends Family{

    public Leaf(String name) {
        super(name);
    }

    public void add(Family component) {
        // 注意:叶节点是没有子节点的
    }

    public void remove(Family component) {
        // 注意:叶节点是没有子节点的
    }

    public void display(int depth) {

        String level = "";

        for(int i=0;i<depth;i++) {
            level += "-";
        }
        System.out.println(level + name);
    }
}
package com.oop.demo1;

import java.util.ArrayList;
import java.util.List;

/**
 * 定义有节点的行为,用于存储子部件
 * @author Liudeli
 *
 */
public class Composite extends Family{

    private List<Family> list = new ArrayList<Family>();

    public Composite(String name) {
        super(name);
    }

    public void add(Family component) {
        list.add(component);
    }

    public void remove(Family component) {
        list.add(component);
    }

    public void display(int depth) {
        for (Family component : list) {
            component.display(depth + 2);
        }
    }

}
/**
 * 测试程序
 * @author Liudeli
 *
 */
public class Main {

    public static void main(String[] args) {
        // root 
        Composite root = new Composite("root");
        root.add(new Leaf("伯伯"));
        root.add(new Leaf("叔叔"));

        Composite comp1 = new Composite("Comp X");
        comp1.add(new Leaf("大儿子"));
        comp1.add(new Leaf("二儿子"));

        root.add(comp1);

        Composite comp2 = new Composite("Comp Y");
        comp2.add(new Leaf("三儿子"));
        comp2.add(new Leaf("小儿子"));

        root.add(comp2);

        root.add(new Leaf("父亲"));

        root.display(1);
    }

}

运行结果:
这里写图片描述


这里写图片描述


谢谢大家的观看,更多精彩技术博客,会不断的更新,请大家访问,
刘德利CSDN博客, http://blog.csdn.net/u011967006