【設計模式】(十四)--結構型模式--組合模式

【設計模式】(十四)–結構型模式–組合模式

組合模式定義

Compose objects into tree srtuctures to represent part-whole hierarchies . Composite lets clients treat individual objects and compositions of objects uniformly.

意思是:將對象組合成樹形結構以表示“部分–整體”的層次結構,使得用戶對單個對象和組合對象的使用具有一致性。
組合模式一般有3個元素

  • Component 抽象節點
  • Leaf 葉子結點
  • Composite 複合節點,該節點包括符合節點的子節點或者葉子節點的子節點

組合模式的優點

  • 1、高層模塊調用簡單。
  • 2、節點自由增加。

組合模式在使用時,其葉子和樹枝的聲明都是實現類,而不是接口,違反了依賴倒置原則。不易使用繼承的方法來增加新的行爲,不易控制樹枝構建的類型。

組合模式的使用場景

需要描述對象的部分和整體的等級結構的場景,如樹形菜單,文件、文件夾的管理。需要使用者忽略個體構建和組合構建的區別,平等對待所有的構件。

組合模式的簡單實現

類圖
在這裏插入圖片描述

實現

public class CompositePatternTest {
    public static void main(String[] args) {
        Employee CEO = new Employee("大少", "CEO", 30000);

        Employee technicalManager = new Employee("二少", "技術經理", 20000);

        Employee opsManager = new Employee("三少", "ops經理", 20000);

        Employee javaDevelop1 = new Employee("二少的小弟1", "Java開發", 10000);
        Employee javaDevelop2 = new Employee("二少的小弟2", "Java開發", 10000);

        Employee ops1 = new Employee("三少的小弟1", "ops開發", 10000);
        Employee ops2 = new Employee("三少的小弟1", "ops開發", 10000);

        CEO.add(technicalManager);
        CEO.add(opsManager);

        opsManager.add(javaDevelop1);
        opsManager.add(javaDevelop2);

        opsManager.add(ops1);
        opsManager.add(ops2);

        System.out.println(CEO);
        for (Employee headEmployee : CEO.getSubordinates()) {
            System.out.println(headEmployee);
            for (Employee employee : headEmployee.getSubordinates()) {
                System.out.println(employee);
            }
        }
    }
}
public class Employee {
    private String name;
    private String dept;
    private int salary;
    private List<Employee> subordinates;

    //構造函數
    public Employee(String name, String dept, int sal) {
        this.name = name;
        this.dept = dept;
        this.salary = sal;
        subordinates = new ArrayList<Employee>();
    }

    public void add(Employee e) {
        subordinates.add(e);
    }

    public void remove(Employee e) {
        subordinates.remove(e);
    }

    public List<Employee> getSubordinates() {
        return subordinates;
    }

    public String toString() {
        return ("【Employee】姓名 : " + name
                + ", dept : " + dept + ", salary :"
                + salary + " ");
    }
}

結果
在這裏插入圖片描述

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