如果把北京總公司比作乙個大樹的話,它的下屬分公司就是這棵樹的分枝
,至於各辦事處是更小的分支
,而它們的相關職能部門由於沒有分枝了
,可以理解為樹葉
.儘管天下沒有相同的樹葉
,但是同一棵樹上長出來的樹葉樣子也不會相差到哪去
.也就是說
,若使總部的財務管理功能復用於子公司
,最好的辦法是
,處理總公司的財務管理功能和處理子公司的財務管理功能的方法是一樣的.
組合模式:
將物件組成樹形結構,以表示」部分-整體」的層次結構.組合模式使得使用者對單個物件和組合物件的使用具有一致性.
public
abstract
classcomponent {
protectedstring
name;
publiccomponent(string
name) {
this.name = name;
public
abstract
voidadd(component
c);public
abstract
voidremove(component
c);public
abstract
voiddisplay(intdepth);
//葉節點下沒有子節點
public
classleafextendscomponent {
publicleaf(string
name) {
super(name);
@override
public
voidadd(component
c) {
//由於葉子沒有再增加分枝和樹葉,所以add和remove方法對實現它沒有意義
//但是這樣做可以消除葉節點和枝節點物件在抽象層次的區別,它們具有完全一致的介面
system.out
.println("cannot add a leaf");
@override
public
voidremove(component
c) {
system.out
.println("cannot remove from a leaf");
@override
public
voiddisplay(intdepth) {
//顯示其級別和名稱
for(inti=0;i
system.out
.print("-");
system.out
.println(name);
public
classcompositeextendscomponent {
privatelist
children=newarraylist
();publiccomposite(string
name) {
super(name);
@override
public
voidadd(component
c) {
children.add(c);
@override
public
voidremove(component
c) {
children.remove(c);
@override
public
voiddisplay(intdepth) {
for(inti=0;i
system.out
.print("-");
system.out
.println(name);
depth+=2;
for(component
component : children) {
component.display(depth);
public
classdemo {
public
static
voidmain(string args) {
//生成樹根root,根上長出兩片葉子leafa,和leafb
composite
root=newcomposite("root");
root.add(newleaf("leaf a"));
root.add(newleaf("leaf b"));
//根上長出分支compositex,分支上有兩片葉子leafxa和leafxb
composite
comp=newcomposite("compositex");
comp.add(newleaf("leaf xa"));
comp.add(newleaf("leaf xb"));
root.add(comp);
//在compositex上再長出兩片葉子leafxya和leafxyb
composite
comp2=newcomposite("compositexy");
comp2.add(newleaf("leaf xya"));
comp2.add(newleaf("leaf xyb"));
comp.add(comp2);
//展示大樹的形態
root.display(1);
問題描述:為什麼
leaf
類中也有
add和
remove方法,
樹葉不是不可以再長分支嗎
?這種方式是透明方式,在
component
中宣告所有用來管理子物件的方法
,這樣實現
component
介面的所有子類都具備了
add和
remove.
這樣做的好處是葉節點和枝節點對於外界沒有區別
,它們具備完全一致的行為介面
.但是問題來了,由於
leaf
類本身沒有
add和
remove方法,
所以實現它是沒有意義的
.使用安全方式可以避免做這樣的無用功
,就是在介面
component
介面中不去宣告
add和
remove方法,
那麼子類的
leaf
也不需要去實現它
,而是在
composite
宣告所有用來管理子類物件的方法
,但是由於不夠透明
,所以樹葉和樹枝類將不具有相同的介面
,客戶端呼叫需要進行相應的判斷
,帶來了不便
.兩者各有好處
,視情況而定
何時使用組合模式?
需求中是體現部分和整體層次的結構時,你希望使用者可以忽略組合物件與單個物件的不同
,統一地使用組合結構中的所有物件時
,就可以考慮使用組合模式了.
組合模式的好處?
基本物件可以被組合成更複雜的組合物件,而這個組合物件又可以被組合
.使用者是不用關心到底是處理乙個葉節點還是處理乙個組合元件
,也就用不著為定義組合而寫一些判斷的語句
.說白了
,組合模式讓客戶可以一致地使用組合結構和單個物件
.
java組合模式
composite定義 將物件以樹形結構組織起來,以達成 部分 整體 的層次結構,使得客戶端對單個物件和組合物件的使用具有一致性.composite比較容易理解,想到composite就應該想到樹形結構圖。組合體內這些物件都有共同介面,當組合體乙個物件的方法被呼叫執行時,composite將遍歷 i...
Java設計模式 組合模式
組合模式 composite使用組合模式的場景 把部分和整體的關係用樹形結構來表示,從而使客戶端可以使用統一的方式處理部分物件和整體物件。開發中的應用場景 作業系統的資源管理器 gui中的容器層次圖 xml檔案解析 oa系統中,組織結構的處理 component abstractfile 抽象構件 ...
JAVA 設計模式 組合模式
用途 組合模式 component 將物件組合成樹形結構以表示 部分 整體 的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有唯一性。組合模式是一種結構型模式。結構 圖 組合模式結構圖 component 組合中的物件宣告介面,在適當的情況下,實現所有類共有介面的預設行為。宣告乙個介面用於...