概念:
組合模式(Composite Pattern)
組合模式,將對象組合成樹形結構以表示“部分-整體”的層次結構,組合模式使得用戶對單個對象和組合對象的使用具有一致性。
有時候又叫做部分-整體模式,它使我們樹型結構的問題中,模糊了簡單元素和複雜元素的概念,客戶程序可以像處理簡單元素一樣來處理複雜元素,從而使得客戶程序與複雜元素的內部結構解耦。
組合模式經典案例:系統目錄結構,網站導航結構等。
其類結構圖如下:
案例,現規劃方案實現某科技公司業務部門結構
代碼:
部門類:
public abstract class Depat {
private String name;
private List<Depat> subDepat;
private Depat parent;
public abstract Depat addSubDepatment(Depat depasub);
public abstract Depat removeSubDepatment(Depat depasub);
public abstract Depat display();
public Depat() {
}
public Depat(String depatname) {
setName(depatname);
}
public Depat getParent() {
return parent;
}
public void setParent(Depat parent) {
this.parent = parent;
}
public List<Depat> getSubDepat() {
return subDepat;
}
public void setSubDepat(List<Depat> subDepat) {
this.subDepat = subDepat;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Depatment extends Depat{
public Depatment() {
super();
setSubDepat(new ArrayList<Depat>());
}
public Depatment(String depatmentname) {
super(depatmentname);
setSubDepat(new ArrayList<Depat>());
}
@Override
public Depat addSubDepatment(Depat depasub) {
depasub.setParent(this);
getSubDepat().add(depasub);
return this;
}
@Override
public Depat removeSubDepatment(Depat depasub) {
depasub.setParent(null);
getSubDepat().remove(depasub);
return this;
}
@Override
public Depat display() {
System.out.println(String.format("%s", this.getName()));
for(Depat depat : getSubDepat()){
depat.display();
}
return this;
}
}
Company類
public class Company {
Depatment root = null;
public Depatment getRoot() {
return root;
}
public void setRoot(Depatment root) {
this.root = root;
}
public Company(String Name) {
root = new Depatment(Name);
}
}
測試類:
public class WorkClass {
public void test() {
Company company = new Company("某科技公司");
company.getRoot().addSubDepatment(
new Depatment("筆電大部").
addSubDepatment(new Depatment("筆電硬件研發部").
addSubDepatment(new Depatment("筆電硬件北京研發部")).
addSubDepatment(new Depatment("筆電硬件深圳研發部"))).
addSubDepatment(new Depatment("筆電軟件研發部").
addSubDepatment(new Depatment("筆電軟件杭州研發部")).
addSubDepatment(new Depatment("筆電軟件蘇州研發部"))))
.addSubDepatment(
new Depatment("手機大部").
addSubDepatment(new Depatment("手機硬件研發部").
addSubDepatment(new Depatment("手機硬件北京研發部")).
addSubDepatment(new Depatment("手機硬件深圳研發部"))).
addSubDepatment(new Depatment("手機軟件研發部").
addSubDepatment(new Depatment("手機軟件杭州研發部")).
addSubDepatment(new Depatment("手機軟件蘇州研發部"))));
company.getRoot().display();
}
}
輸出:
06-21 09:19:32.954 12750-12750/com.example.qinghua_liu.myapplication I/System.out: 某科技公司
06-21 09:19:32.954 12750-12750/com.example.qinghua_liu.myapplication I/System.out: 筆電大部
06-21 09:19:32.954 12750-12750/com.example.qinghua_liu.myapplication I/System.out: 筆電硬件研發部
06-21 09:19:32.954 12750-12750/com.example.qinghua_liu.myapplication I/System.out: 筆電硬件北京研發部
06-21 09:19:32.954 12750-12750/com.example.qinghua_liu.myapplication I/System.out: 筆電硬件深圳研發部
06-21 09:19:32.954 12750-12750/com.example.qinghua_liu.myapplication I/System.out: 筆電軟件研發部
06-21 09:19:32.954 12750-12750/com.example.qinghua_liu.myapplication I/System.out: 筆電軟件杭州研發部
06-21 09:19:32.954 12750-12750/com.example.qinghua_liu.myapplication I/System.out: 筆電軟件蘇州研發部
06-21 09:19:32.954 12750-12750/com.example.qinghua_liu.myapplication I/System.out: 手機大部
06-21 09:19:32.954 12750-12750/com.example.qinghua_liu.myapplication I/System.out: 手機硬件研發部
06-21 09:19:32.954 12750-12750/com.example.qinghua_liu.myapplication I/System.out: 手機硬件北京研發部
06-21 09:19:32.954 12750-12750/com.example.qinghua_liu.myapplication I/System.out: 手機硬件深圳研發部
06-21 09:19:32.954 12750-12750/com.example.qinghua_liu.myapplication I/System.out: 手機軟件研發部
06-21 09:19:32.954 12750-12750/com.example.qinghua_liu.myapplication I/System.out: 手機軟件杭州研發部
06-21 09:19:32.954 12750-12750/com.example.qinghua_liu.myapplication I/System.out: 手機軟件蘇州研發部
結語:
組合模式(Composite Pattern)它使我們樹型結構的問題中,模糊了簡單元素和複雜元素的概念
,客戶程序可以向處理簡單元素一樣來處理複雜元素,從而使得客戶程序與複雜元素的內部結構解耦。組合模式讓你可以優化處理遞
歸或分級數據結構。有許多關於分級數據結構的例子,使得組合模式非常有用武之地。