1. 程式人生 > >設計模式之組合模式(Composite Pattern)

設計模式之組合模式(Composite Pattern)

組合模式(Composite Pattern),又叫部分整體模式,是用於把一組相似的物件當作一個單一的物件。組合模式依據樹形結構來組合物件,用來表示部分以及整體層次。這種型別的設計模式屬於結構型模式,它建立了物件組的樹形結構。
介紹
意圖:將物件組合成樹形結構以表示"部分-整體"的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。

主要解決:它在我們樹型結構的問題中,模糊了簡單元素和複雜元素的概念,客戶程式可以向處理簡單元素一樣來處理複雜元素,從而使得客戶程式與複雜元素的內部結構解耦。

何時使用: 1、您想表示物件的部分-整體層次結構(樹形結構)。 2、您希望使用者忽略組合物件與單個物件的不同,使用者將統一地使用組合結構中的所有物件。

如何解決:樹枝和葉子實現統一介面,樹枝內部組合該介面。

關鍵程式碼:樹枝內部組合該介面,並且含有內部屬性 List,裡面放 Component。

應用例項: 1、算術表示式包括運算元、操作符和另一個運算元,其中,另一個操作符也可以是運算元、操作符和另一個運算元。 2、在 JAVA AWT 和 SWING 中,對於 Button 和 Checkbox 是樹葉,Container 是樹枝。

優點: 1、高層模組呼叫簡單。 2、節點自由增加。

缺點:在使用組合模式時,其葉子和樹枝的宣告都是實現類,而不是介面,違反了依賴倒置原則。

使用場景:部分、整體場景,如樹形選單,檔案、資料夾的管理。

程式碼:
員工類:

public class Employee {
    private int id;
    private String name;
    private String dept;
    private int salary;
    private List<Employee> subsubordinates;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getDept() {
        return dept;
    }

    public void setDept(String dept) {
        this.dept = dept;
    }

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    public List<Employee> getSubsubordinates() {
        return subsubordinates;
    }

    public void setSubsubordinates(List<Employee> subsubordinates) {
        this.subsubordinates = subsubordinates;
    }

    public Employee() {
        super();
    }

    public Employee(int id, String name, String dept, int salary, List<Employee> subsubordinates) {
        super();
        this.id = id;
        this.name = name;
        this.dept = dept;
        this.salary = salary;
        this.subsubordinates = subsubordinates;
    }

    @Override
    public String toString() {
        String a = "Employee [id=" + id + ", name=" + name + ", dept=" + dept + ", salary=" + salary + "]\n";
        String b = "";
        if (subsubordinates != null && subsubordinates.size() > 0) {
            for (Employee employee : subsubordinates) {
                b += employee.toString();
            }
        }
        return a + b;
    }

}

測試:

public class Test {
    public static void main(String[] args) {
        Employee e1=new Employee(201, "張三", "侍郎", 3000, null);
        Employee e2=new Employee(201, "李四", "侍郎", 3000, null);
         List<Employee> eList=new ArrayList<>();
         eList.add(e1);
         eList.add(e2);
        Employee manager=new Employee(200, "司馬光", "戶部", 10000, eList);
        List<Employee> bList=new ArrayList<>();
        bList.add(manager);
        Employee boss=new Employee(001, "皇帝", "總部", 300000, bList);
        System.out.println(boss.toString());
        
    }
}

列印結果:

Employee [id=1, name=皇帝, dept=總部, salary=300000]
Employee [id=200, name=司馬光, dept=戶部, salary=10000]
Employee [id=201, name=張三, dept=侍郎, salary=3000]
Employee [id=201, name=李四, dept=侍郎, salary=3000]

總結:
組合模式 就是一個DTO裡面再來同類的DTO。在學習hibernate裡面的一對多就寫過這個,很熟悉。

原部落格地址