設計模式之組合模式(Composite Pattern)
阿新 • • 發佈:2018-11-29
組合模式(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裡面的一對多就寫過這個,很熟悉。