大話設計模式筆記(十六) 組合模式

2022-05-02 03:12:09 字數 4394 閱讀 1058

將物件組合成樹形結構以表示「部分-整體」的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。

* 組合物件

* 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 葉...