Java組合設(shè)計模式
定義
組合模式(Composite Pattern),又叫部分整體模式,它創(chuàng)建了對象組的樹形結(jié)構(gòu),將對象組合成樹狀結(jié)構(gòu)以表示“整體-部分”的層次關(guān)系。組合模式依據(jù)樹狀結(jié)構(gòu)來組合對象,用來表示部分以及整體層次。這種設(shè)計模式屬于結(jié)構(gòu)性模式。組合模式使得用戶對單個對象和組合對象的訪問具有一致性,即:組合能讓客戶以一致的方式處理個別對象以及組合對象。
對應(yīng)角色
- 抽象構(gòu)件(Component)角色:它的主要作用是為樹葉構(gòu)件和樹枝構(gòu)件聲明公共接口,并實現(xiàn)它們的默認(rèn)行為。在透明式的組合模式中抽象構(gòu)件還聲明訪問和管理子類的接口;在安全式的組合模式中不聲明訪問和管理子類的接口,管理工作由樹枝構(gòu)件完成。
- 樹葉構(gòu)件(Leaf)角色:是組合中的葉節(jié)點對象,它沒有子節(jié)點,用于繼承或?qū)崿F(xiàn)抽象構(gòu)件。
- 樹枝構(gòu)件(Composite)角色 / 中間構(gòu)件:是組合中的分支節(jié)點對象,它有子節(jié)點,用于繼承和實現(xiàn)抽象構(gòu)件。它的主要作用是存儲和管理子部件,通常包含 Add ()、Remove ()、GetChild () 等方法
優(yōu)缺點
優(yōu)點
- 定義層次:清楚地定義分層次的復(fù)雜對象,表示對象的全部或部分層次。
- 忽略層次:讓客戶端忽略層次之間的差異,方便對整個層次結(jié)構(gòu)進(jìn)行控制。
- 簡化客戶端代碼。
- 符合開閉原則。
缺點
- 限制類型復(fù)雜:限制類型時,比較復(fù)雜。如:某個目錄中只能包含文本文件,使用組合模式時,不能依賴類型系統(tǒng),施加約束,它們都來自于節(jié)點的抽象層。在這種情況下,必須通過在運行時進(jìn)行類型檢查,這樣就變得比較復(fù)雜。
- 使設(shè)計變得更加抽象1。
應(yīng)用場景
組合模式適用于處理樹形結(jié)構(gòu)的場景,例如文件系統(tǒng),根目錄下有若干文件和目錄,在二級目錄下還有目錄和文件。這種情況下,適合使用組合模式。組合模式使客戶端對單個對象和組合對象保持一致的方式處理12。文章來源:http://www.zghlxwxcb.cn/news/detail-558212.html
組合模式在用戶界面中也有廣泛的應(yīng)用,例如在窗口、菜單、按鈕等UI組件中都可以使用組合模式來設(shè)計。在這些場景中,組合模式可以很好地管理組件的層級關(guān)系,并且可以方便地對整個界面進(jìn)行布局和維護(hù)文章來源地址http://www.zghlxwxcb.cn/news/detail-558212.html
實例
import java.util.ArrayList;
import java.util.List;
public class Employee {
private String name;
private String dept;
private int salary;
private List<Employee> subordinates;
//構(gòu)造函數(shù)
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 : "+ name
+", dept : "+ dept + ", salary :"
+ salary+" ]");
}
}
public class CompositePatternDemo {
public static void main(String[] args) {
Employee CEO = new Employee("John","CEO", 30000);
Employee headSales = new Employee("Robert","Head Sales", 20000);
Employee headMarketing = new Employee("Michel","Head Marketing", 20000);
Employee clerk1 = new Employee("Laura","Marketing", 10000);
Employee clerk2 = new Employee("Bob","Marketing", 10000);
Employee salesExecutive1 = new Employee("Richard","Sales", 10000);
Employee salesExecutive2 = new Employee("Rob","Sales", 10000);
CEO.add(headSales);
CEO.add(headMarketing);
headSales.add(salesExecutive1);
headSales.add(salesExecutive2);
headMarketing.add(clerk1);
headMarketing.add(clerk2);
//打印該組織的所有員工
System.out.println(CEO);
for (Employee headEmployee : CEO.getSubordinates()) {
System.out.println(headEmployee);
for (Employee employee : headEmployee.getSubordinates()) {
System.out.println(employee);
}
}
}
}
到了這里,關(guān)于Java組合設(shè)計模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!