java-设计模式-组合模式

设计模式-组合模式
    将对象组合成树形结构来表示 “部分-整体”的层次结构。
    叶子节点 和 支节点,支节点可以有支节点和叶子结点,叶子结点则不能有。
    例子:
        文件 -> 文件夹1(文件夹11(文件111),文件12)、文件2
        公司、分公司、公司部门

公司分公司和子公司的例子:

公司抽象类:


import java.util.Comparator;

public abstract class Company implements Comparator {
    protected String name;
    protected int level = 0;
    public Company(String name){
        this.name = name;
    }
    public Company(String name,int level){
        this.name = name;
        this.level = level;
    }
    /**
     * 添加
     */
    abstract boolean add(Company c);

    /**
     * 删除
     */
    abstract boolean remove(Company c);

    /**
     * 显示
     */
    public void display(){
        for (int i=0;i< level;i++){
            System.out.print("--");
        }
        System.out.println(name+"("+level+")");
    }


    /**
     *  仅仅是示范
     */
    @Override
    public int compare(Object o1, Object o2) {
        return o1.hashCode() - o2.hashCode();
    }

    //getter and setter

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getLevel() {
        return level;
    }

    public void setLevel(int level) {
        this.level = level;
    }
}

具体的公司(支队节点):


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

/**
 * 实例公司
 */
public class ConcreteCompany extends Company {

    private List<Company> children = new ArrayList<>();

    public ConcreteCompany(String name) {
        super(name);
    }
    public ConcreteCompany(String name,int level) {
        super(name,level);
    }

    @Override
    boolean add(Company c) {
        c.level = this.level + 1;
        return children.add(c);
    }

    @Override
    boolean remove(Company c) {
        return children.remove(c);
    }

    @Override
    public void display() {
        super.display();
        children.forEach(Company::display);
    }

}

公司下的部门(叶子节点) 


/**
 * 部门
 */
public class DeptCompany extends Company{
    public DeptCompany(String name) {
        super(name);
    }

    @Override
    boolean add(Company c) {
        return false;
    }

    @Override
    boolean remove(Company c) {
        return false;
    }

 /*   @Override
    void display() {
        System.out.println(name);
    }*/
}

如果使用:

public static void main(String[] args) {
        Company mainCompany = new ConcreteCompany("总公司",0);
        mainCompany.add(new DeptCompany("总公司人力部门"));
        mainCompany.add(new DeptCompany("总公司财务部门"));
        Company shC = new ConcreteCompany("上海分公司");
        Company gdC = new ConcreteCompany("广东分公司");
        Company hb = new ConcreteCompany("湖北分公司");
        mainCompany.add(shC);
        mainCompany.add(gdC);
        mainCompany.add(hb);
        shC.add(new DeptCompany("上海人事部"));
        shC.add(new DeptCompany("上海财政部"));
        gdC.add(new DeptCompany("广东市场部"));
        gdC.add(new DeptCompany("广东研发部"));
        gdC.add(new DeptCompany("广东应急部"));

        mainCompany.display();

    }

测试结果:

总公司(0)
--总公司人力部门(1)
--总公司财务部门(1)
--上海分公司(1)
----上海人事部(2)
----上海财政部(2)
--广东分公司(1)
----广东市场部(2)
----广东研发部(2)
----广东应急部(2)
--湖北分公司(1)

 

组合模式 就是树形结构来存储 整体 和 部分 的层次结构。

还是比较简单的,因为我们都熟悉树形结构。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章