人物:小菜,大鳥
事件:小菜遇到了乙個難題,他的公司開發了乙個oa系統,然後甲方希望在分公司推廣,共用同一套系統,於是大鳥推出了組合模式,傳給了小菜,解決了問題。
組合模式:
1.簡述了組合模式,闡述了原理,實現,還有部分疑問答疑
2.用組合模式解決小菜的問題例項
1.概念:將物件組合成樹形結構以表示'部分-整體'的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性
2.結構圖:
3.**如下:
component類,是組合中的物件宣告介面,在適當情況下,實現所有類共有的預設行為。宣告乙個介面用於訪問和管理component的子部件:
publicleaf類,在組合中表示葉節點物件,葉節點沒有子節點,所以add和remove實現沒有意義,如下的實現實現方式可以消除葉節點和枝節點物件在抽象層次的區別,它們就可以具備完全一致的介面:abstract
class
component
public
abstract
void
add(component c);
public
abstract
void
remove(component c);
public
abstract
void display(int
depth);
}
@slf4jcomposite類,定義枝節點行為,用來儲存子部件,在component介面中實現與子部件有關的操作,比如進行add和remove:public
class leaf extends
component
@override
public
void
add(component c)
@override
public
void
remove(component c)
@override
public
void display(int
depth)
}
@slf4j客戶端**:public
class composite extends
component
@override
public
void
add(component c)
@override
public
void
remove(component c)
@override
public
void display(int
depth) }}
public輸出結果:class
componentclient
}
1root展示如下:3leaf a
3leaf b
3composite x
5leaf xa
5leaf xb
5composite xy
7leaf xya
7leaf xyb
3leaf c
4.透明方式與安全方式
(1)問:葉子節點不是不能再分枝麼,為什麼leaf類中還有add和remove
答:現在的處理方式叫做透明方式。這樣在component中會宣告所有用來管理子物件的方法,其中包括add,remove等,這樣component介面的所有子類都具備了add和remove,所以好處就是使得葉子節點和枝節點對於外界就沒有區別了,它們具備完全一致的行為介面,當然問題也很明顯,因為leaf類本身不具備add和remove,所以這兩個方法的實現沒有意義。
(2)問:在1問中所說的問題,那我不希望做無用功,可以add和remove方法麼?
答:可以,那就需要安全方式。就不在component介面中實現add和remove方法,而是在composite中實現,這樣雖然解決了這個問題,但由於不夠透明,所以樹葉樹枝類不再具有相同的介面,導致客戶端的呼叫需要加入判斷,帶來了不便。
5.什麼時候選擇用組合模式呢?
答:當需求中是體現整體和部分層次的結構時,以及你希望使用者可以忽略組合物件和單個物件的不同,統一地使用組合結構中的所有物件時,就該考慮用組合模式了。
1.**結構圖:
2.**實現:
公司類,抽閒類或介面:
publicconcretecompany類,具體公司類,實現介面,樹枝節點:abstract
class
company
/*** 增加**
@param
c
*/public
abstract
void
add(company c);
/*** 移除**
@param
c
*/public
abstract
void
remove(company c);
/*** 展示**
@param
depth
*/public
abstract
void display(int
depth);
/*** 履行職責
*/public
abstract
void
lineofduty();
}
@slf4jhrdepartment類和financedepartment類,人力資源部類和財務部類,葉子節點:public
class concretecompany extends
company
@override
public
void
add(company c)
@override
public
void
remove(company c)
@override
public
void display(int
depth)
}@override
public
void
lineofduty() }}
@slf4jpublic
class hrdepartment extends
company
@override
public
void
add(company c)
@override
public
void
remove(company c)
@override
public
void display(int
depth)
@override
public
void
lineofduty() 員工招聘培訓機構", name);}}
@slf4j客戶端呼叫:public
class financedepartment extends
company
@override
public
void
add(company c)
@override
public
void
remove(company c)
@override
public
void display(int
depth)
@override
public
void
lineofduty() 公司財務收支管理", name);}}
@slf4j組合模式的好處:public
class
componentclient
}
(1)使用者不關心處理的是葉子節點還是組合元件,這樣就不用定義組合而寫判斷語句了
(2)基本物件可以被組合成複雜的組合物件,而組合物件又可以被組合,這樣可以一直遞迴下去,這樣任何用到基礎物件的地方就都可以用到組合物件了。
大話設計模式讀書筆記(十六) 組合模式
組合模式 composite 將物件組合成樹形結構以表示 部分 整體 的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。compoent為組合中的物件宣告乙個介面 在適當情況下,實現所有類共有介面的預設行為。宣告乙個介面用於訪問和管理compoent的子部件 public abst...
大話設計模式讀書筆記(十六) 組合模式
組合模式 composite 將物件組合成樹形結構以表示 部分 整體 的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。compoent為組合中的物件宣告乙個介面 在適當情況下,實現所有類共有介面的預設行為。宣告乙個介面用於訪問和管理compoent的子部件 public abst...
讀書筆記 大話設計模式
大話設計模式 的確寫的很不錯。把晦澀解懂的設計模式,講的通俗易懂。邊讀邊用evernote做筆記,把印象深刻的整理了一下。先補習一下uml的圖示法 繼承,介面,組合,依賴,關聯 策略模式 strategy 定義一系列演算法,所有演算法完成的都是相同的工作,只是實現不同。減少演算法與使用類之間的藕合。...