將物件組合成樹形結構以表示「部分-整體」的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。
* 組合物件
* created by callmedevil on 2019/8/11.
*/public abstract class component
// 通常都用add 和remove 方法來提供增加或移除樹葉或樹枝的功能
public abstract void add(component c);
public abstract void remove(component c);
public abstract void dispaly(int depth);
}
/**
* 枝節點行為,用來儲存子部件
* created by callmedevil on 2019/8/11.
*/public class composite extends component
@override
public void add(component c)
@override
public void remove(component c)
@override
public void dispaly(int depth)
// 顯示枝節點名稱,並對其下級進行遍歷
system.out.println(string.format("%s %s", sb.tostring(), name));
for (component child : children) }}
/**
* 葉節點物件
* created by callmedevil on 2019/8/11.
*/public class leaf extends component
@override
public void add(component c)
@override
public void remove(component c)
@override
public void dispaly(int depth)
// 顯示名稱和級別
system.out.println(string.format("%s %s", sb.tostring(), name));}}
public class test
}
- root
---- leaf a
---- leaf b
---- composite x
------- leaf xa
------- leaf xb
------- composite xy
---------- leaf xya
---------- leaf xyb
---- leaf c
樹可能有無數的分枝,反覆使用 composite 就可以實現樹狀結構,但樹葉不可以再長分枝,為什麼此處 leaf 當中也有實現 add 和 remove?
這種叫做透明方式,也就是說在 component 中宣告所有用來管理子物件的方法,其中包括 add, remove 等。這樣實現 component 介面的所有子類都具備了 add 和 remove。這樣做的好處是葉節點和枝節點對於外界沒有區別,它們具備完全一致的行為介面,但問題也明顯,因為本身不具體 add 和 remove 功能,所以實現是沒有意義的。
當然也可以不去實現,這種叫做安全方式,也就是在 component 介面中不去宣告 add 和 remove 方法,那麼子類的 leaf 也就不需要去實現,而是在 composite 宣告所有用來管理子類物件的方法,不過由於不夠透明,所以樹葉和樹枝將不具有相同的介面,客戶端的呼叫需要做相應的判斷,帶來了不便。
當需求中是體現部分與整體層次的結構時,以及希望使用者可以忽略組合物件與單個物件的不同,統一的使用組合結構中的所有物件時,就應該考慮用組合模式了。
總公司與分公司關係,總公司的所有管理功能同樣能使用在分公司。
/**
* 公司抽象類
* created by callmedevil on 2019/8/11.
*/public abstract class company
public abstract void add(company c);
public abstract void remove(company c);
public abstract void dispaly(int depth);
public abstract void lineofduty(); // 履行職責,不同部門需要履行不同的職責
// 用於輸出層次結構,非必須,與模式無關
public string getdepth(int depth)
return sb.tostring();}}
/**
* 具體公司(樹枝節點)
* created by callmedevil on 2019/8/11.
*/public class concretecompany extends company
@override
public void add(company c)
@override
public void remove(company c)
@override
public void dispaly(int depth)
}@override
public void lineofduty() }}
/**
* 人力資源部(樹葉節點)
* created by callmedevil on 2019/8/11.
*/public class hrdepartment extends company
@override
public void add(company c) {}
@override
public void remove(company c) {}
@override
public void dispaly(int depth)
@override
public void lineofduty()
}
/**
* 財務部(樹葉節點)
* created by callmedevil on 2019/8/11.
*/public class financedepartment extends company
@override
public void add(company c) {}
@override
public void remove(company c) {}
@override
public void dispaly(int depth)
@override
public void lineofduty()
}
public class test
}
結構圖:
- 北京總公司
---- 總公司人力資源部
---- 總公司財務部
---- 上海分公司
------- 上海分公司人力資源部
------- 上海分公司財務部
------- 南京辦事處
---------- 南京辦事處人力資源部
---------- 南京辦事處財務部
------- 杭州辦事處
---------- 杭州辦事處人力資源部
---------- 杭州辦事處財務部
職責:總公司人力資源部 員工招聘培訓管理
總公司財務部 公司財務收支管理
上海分公司人力資源部 員工招聘培訓管理
上海分公司財務部 公司財務收支管理
南京辦事處人力資源部 員工招聘培訓管理
南京辦事處財務部 公司財務收支管理
杭州辦事處人力資源部 員工招聘培訓管理
杭州辦事處財務部 公司財務收支管理
大話設計模式讀書筆記(十六) 組合模式
組合模式 composite 將物件組合成樹形結構以表示 部分 整體 的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。compoent為組合中的物件宣告乙個介面 在適當情況下,實現所有類共有介面的預設行為。宣告乙個介面用於訪問和管理compoent的子部件 public abst...
大話設計模式讀書筆記(十六) 組合模式
組合模式 composite 將物件組合成樹形結構以表示 部分 整體 的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。compoent為組合中的物件宣告乙個介面 在適當情況下,實現所有類共有介面的預設行為。宣告乙個介面用於訪問和管理compoent的子部件 public abst...
大話設計模式 組合模式
abstract class component public abstract function add component c public abstract function remove component c public abstract function display depth 葉...