設計模式之組合模式

2021-08-09 06:07:36 字數 2609 閱讀 3491

組合模式(composite)將物件組合成樹形結構以表示「部分-整體」的層次結構。composite使得客戶對單個物件和復合物件的使用具有一致性。

需求:公司管理系統的設計,公司有多個部門,總公司又含有子公司。

示例定義公司物件的抽象父類,定義具體的職責:

public abstract class company 

//增加公司

public abstract void add(company company);

//移除公司

public abstract void remove(company company);

//顯示

public abstract void display(int depth);

//部門履行的職責

public abstract void lineofduty();

}

公司的實現類:

public class concretecompany extends company 

@override

public void add(company company)

@override

public void remove(company company)

@override

public void display(int depth)

system.out.println(sb+ name);

for (company c : chldren

) }@override

public void lineofduty()

}}

定義公司的部門–人事部

public class hrdepartment extends company 

@override

public void add(company company)

@override

public void remove(company company)

@override

public void display(int depth)

system.out.println(sb + name);

}@override

public void lineofduty()

}

再來乙個財務部

public class financedepartment extends company 

@override

public void add(company company)

@override

public void remove(company company)

@override

public void display(int depth)

system.out.println(sb + name);

}@override

public void lineofduty()

}

到此,我們就可以建立乙個公司,而且公司裡可以有財務部和人事部了;執行測試:

public void compositetest()
執行結果:

-北京總公司

---總公司人事部

---總公司財務部

---上海分公司

-----上海分公司人事部

-----上海分公司財務部

---南京分公司

-----南京分公司人事部

-----南京分公司財務部

---香港分公司

-----香港分公司人事部

-----香港分公司財務部

總公司人事部人事管理

總公司財務部財務管理

上海分公司人事部人事管理

上海分公司財務部財務管理

南京分公司人事部人事管理

南京分公司財務部財務管理

香港分公司人事部人事管理

香港分公司財務部財務管理

如果我們需要新增乙個子公司或者是部門,只需要宣告相關的物件即可。

透明方式與安全方式

上面的實現方式為透明方式:

也就是說在component(company)中宣告所有來管理子物件的方法,其中包括add,remove等。這樣實現的component介面的所有子類都具備了add和remove。這樣做的好處就是葉節點和枝節點對於外界沒有區別,他們具備完全一致的行為介面。但問題也很明顯,因為葉節點本身不具備add(),remove()方法的功能,所以實現它是沒有意義的。

安全方式:在component中不去宣告add和remove方法,那麼子類的葉節點就不需要去實現它,而在composite宣告所有來管理子類物件的方法。不過由於不夠透明,所有樹葉和樹枝類將不具備相同的介面,客戶端的呼叫需要做相應的判斷,帶來了不便。

何時使用組合模式:當發現需求中是體現部分與整體層次的結構是,以及你希望使用者可以忽略組合物件與單個物件的不同,統一的使用組合結構中的所有物件時,就應該考慮組合模式了。

設計模式之組合模式

組合模式 以 整體 部分 的層次結構,將物件以樹型結構組合起來。如下圖所示 組合模式首先得定義乙個用來管理和訪問部件們的抽象類。public abstract class equipment 再建立乙個組合體的部件 class element equipment 現在我們再來定義乙個組合體,也就是組...

設計模式之 組合模式

有時候我們需要維護一些物件,這些物件具有一定的層次結構,它們之間雖然差異很大,但在使用的時候我們希望能構一致的對待,比如windows控制項,繪圖中的圖形等,這個時候我們就可以採用組合模式來進行管理。組合模式就是將要管理的物件按樹型結構來進行組織,表示成一種 整體 部分 的層次結構,使得使用者對單個...

設計模式之組合模式

組合模式 將物件組合成樹形結構以表示 部分 整體 的層次結構。使得使用者對單個物件和組合物件的使用具有一致性。適用性 想表示物件的部分 整體層次結構,希望使用者忽略組合物件與單個物件的不同,使用者將統一地使用組合結構中的所有物件。典型表示結構圖 宣告組合中的物件宣告介面 在適當的情況下,實現所有類共...