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)

 

組合模式 就是樹形結構來存儲 整體 和 部分 的層次結構。

還是比較簡單的,因爲我們都熟悉樹形結構。

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