**定義**:將對象組合成樹形結構以表示“部分-整體”的層次結構,使得用戶對單個對象和組合對象的使用具有一致性。
## 一般模式:

Component抽象構件角色
--|定義參與組合對象的共有方法和屬性,可以定義一些默認的行為或屬性。
Leaf葉子構件
--|葉子對象,其下再也沒有其他的分支,也是遍歷的最小單位。
Composite樹枝構件
--|樹枝對象,他的作用是組合樹枝節點和葉子節點形成一個樹形結構。
~~~
public class CompositeTest {
public static void main(String[] args) {
//創建一個根節點
Composite root = new Composite();
root.doSomething();
//創建一個分支
Composite branch = new Composite();
//創建一個葉子節點
Leaf leaf = new Leaf();
//添加分支
root.add(branch);
//添加葉子
branch.add(leaf);
branch.add(leaf);
branch.add(leaf);
//遍歷所有節點
display(root);
}
/**
* 從上到下遍歷,所有節點
* @param root
*/
public static void display(Composite root){
for(Component c : root.getChildren()){
if(c instanceof Leaf){ //如果是葉子節點,就是從
c.doSomething();
}else{
//遞歸調用
display((Composite)c);
}
}
}
}
abstract class Component{
//抽象構件,參與組合構架的共有方法和屬性
public void doSomething(){
System.out.println("執行共有的業務邏輯...");
}
}
/**
* 樹枝構件,組合樹枝節點和葉子節點,形成一個樹形結構
* @author admin
*
*/
class Composite extends Component{
//構件容器
private ArrayList<Component> componentList = new ArrayList<Component>();
//增加一個葉子節點或樹枝節點
public void add(Component component){
this.componentList.add(component);
}
//刪除一個葉子節點或樹枝節點
public void remove(Component component){
this.componentList.remove(component);
}
//遍歷所有的節點
public ArrayList<Component> getChildren(){
return this.componentList;
}
}
/**
* 葉子節點,沒有任何的分支
* @author admin
*
*/
class Leaf extends Component{
//重寫父類的方法
@Override
public void doSomething() {
// TODO Auto-generated method stub
System.out.println("葉子節點,執行方法....");
}
}
~~~
## 一個例子:
如圖是公司員工的樹形圖,要求可以動態的添加員工和部門經理等。并且遍歷輸出。
1、抽取共有方法和屬性作為抽象構件Corp。
2、定義樹枝節點,提供添加節點方法和獲取所有節點的方法CompanyBranch
3、定義葉子節點。CompanyLeaf

UML類圖

~~~
public class CompositeT {
public static void main(String[] args) {
CompanyBranch CEO = getBranch();
System.out.println(CEO.getInfo());
System.out.println(display(CEO));
}
public static CompanyBranch getBranch(){
//添加一個ceo
CompanyBranch CEO = new CompanyBranch("wb", "ceo", 10);
//添加一個財務經理
CompanyBranch FD = new CompanyBranch("xy", "財務經理", 10);
//添加一個銷售經理
CompanyBranch XS = new CompanyBranch("ll", "銷售經理", 10);
//添加一個技術總監
CompanyBranch CTO = new CompanyBranch("lzl", "技術總監", 10);
//添加財務人員
CompanyLeaf a = new CompanyLeaf("小A", "財務人員", 10);
//添加銷售組長
CompanyBranch b = new CompanyBranch("小B", "銷售組長", 10);
//添加銷售組員
CompanyLeaf c = new CompanyLeaf("小C", "銷售組員", 10);
//添加銷售組員
CompanyLeaf e = new CompanyLeaf("小e", "銷售組員", 10);
//添加技術組長
CompanyBranch f = new CompanyBranch("小f", "A項目組長", 10);
//添加技術組長
CompanyBranch g = new CompanyBranch("小g", "B項目組長", 10);
//項目組員
CompanyLeaf h = new CompanyLeaf("小h", "項目A組員", 10);
CompanyLeaf i = new CompanyLeaf("小i", "項目A組員", 10);
CompanyLeaf j = new CompanyLeaf("小j", "項目A組員", 10);
CompanyLeaf k = new CompanyLeaf("小k", "項目B組員", 10);
CompanyLeaf l = new CompanyLeaf("小l", "項目B組員", 10);
CompanyLeaf m = new CompanyLeaf("小m", "項目B組員", 10);
//經理小秘
CompanyLeaf n = new CompanyLeaf("小花", "經理秘書", 10);
//ceo下面是三大經理
CEO.addCorp(FD);
CEO.addCorp(CTO);
CEO.addCorp(XS);
CEO.addCorp(n);
//財務經理的手下
FD.addCorp(a);
//銷售經理的手下
XS.addCorp(b);
//銷售組長的手下
b.addCorp(c);
b.addCorp(e);
//CTO的手下
CTO.addCorp(f);
CTO.addCorp(g);
//項目組長的手下
f.addCorp(h);
f.addCorp(i);
f.addCorp(j);
g.addCorp(k);
g.addCorp(l);
g.addCorp(m);
return CEO;
}
public static String display(CompanyBranch corp){
String info = "";
for(Corp c : corp.getChildren()){
if(c instanceof CompanyLeaf){
info = info + c.getInfo();
}else{
info = info + c.getInfo()+display((CompanyBranch)c);
}
}
return info;
}
}
/**
* 抽象構件,提取共有方法和屬性。
* @author admin
*
*/
abstract class Corp{
//每個員工都有姓名,薪水,職稱
private String name;
private double salary;
private String position;
public Corp(String name,String position,double salary) {
this.name = name;
this.position = position;
this.salary = salary;
}
public String getInfo(){
return "姓名:"+this.name+"\t 職稱:"+this.position+"\t薪水:"+this.salary+"\n";
}
}
/**
* 樹枝構件,提供添加分支的方法和獲取所有節點的方法。
* @author admin
*
*/
class CompanyBranch extends Corp{
//必須有一個私有集合存儲
private ArrayList<Corp> corpList= new ArrayList<Corp>();
public CompanyBranch(String name, String position, double salary) {
super(name, position, salary);
}
//添加分支,樹枝節點或者葉子節點
public void addCorp(Corp corp){
this.corpList.add(corp);
}
//獲取集合。
public ArrayList<Corp> getChildren(){
return this.corpList;
}
}
/**
* 葉子節點,沒有任何分支。
* @author admin
*
*/
class CompanyLeaf extends Corp{
public CompanyLeaf(String name, String position, double salary) {
super(name, position, salary);
}
}
~~~
組合模式不太理解,只能暫時這么總結了。。
- 前言
- 6大設計原則(一)---單一職責原則
- 6大設計原則(二)---里氏替換原則
- 6大設計原則(三)---依賴倒置原則
- 6大設計模式(四)----接口隔離原則
- 6大設計原則(五)---迪米特法則
- 6大設計原則(六)---開閉原則。
- 設計模式(一)---單例模式
- 設計模式(二)---工廠方法模式
- 設計模式(三)---抽象工廠模式
- 設計模式(四)---模板方法模式
- 設計模式(五)---建造者模式
- 設計模式(六)---代理模式
- 設計模式(七)---原型模式
- 設計模式(八)---中介者模式
- 設計模式(九)---命令模式
- 設計模式(十)---責任鏈模式
- 設計模式(十一)---裝飾模式
- 設計模式(十二)---策略模式
- 設計模式(十三)---適配器模式
- 設計模式(十四)---迭代器模式
- 設計模式(十五)---組合模式
- 設計模式(十六)---觀察者模式
- 設計模式(十七)---門面模式
- 設計模式(十八)---備忘錄模式
- 設計模式(十八)---訪問者模式
- 設計模式(二十)---狀態模式
- 設計模式(二十二)---享元模式
- 設計模式(二十三)---橋梁模式