Composite:組合模式
先代碼
package h.l.demo.composite;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author: Is-Me-Hl
* @date: 2020年3月1日
* @Description: 組合模式Demo
*/
public abstract class Composite {
protected String nodeName;
public Composite(String nodeName) {
this.nodeName = nodeName;
}
public abstract void addComposite(Composite composite);
public abstract void removeComposite(Composite composite);
public abstract void display(int depth);
}
/**
*
* @author: Is-Me-Hl
* @date: 2020年3月1日
* @Description: 葉子節點
*/
class Leaf extends Composite {
public Leaf(String nodeName) {
super(nodeName);
}
@Override
public void addComposite(Composite composite) {
System.out.println("Cannot add to a leaf");
}
@Override
public void removeComposite(Composite composite) {
System.out.println("Cannot remove from a leaf");
}
@Override
public void display(int depth) {
System.out.println(depth + "-" + super.nodeName);
}
}
/**
*
* @author: Is-Me-Hl
* @date: 2020年3月1日
* @Description: 分支節點
*/
class Branch extends Composite {
private List<Composite> branch = new ArrayList<>();
public Branch(String nodeName) {
super(nodeName);
}
@Override
public void addComposite(Composite composite) {
branch.add(composite);
}
@Override
public void removeComposite(Composite composite) {
branch.remove(composite);
}
@Override
public void display(int depth) {
System.out.println(depth + "-" + super.nodeName);
for (Composite composite : branch) {
composite.display(depth + 2);
}
}
}
測試類:
package h.l.demo.composite;
import java.util.UUID;
/**
*
* @author: Is-Me-Hl
* @date: 2020年2月14日
* @Description: 測試
*/
public class TestMainEnter {
public static void main(String[] args) {
Composite root = new Branch("root");
root.addComposite(new Leaf("leafA"));
root.addComposite(new Leaf("leafB"));
Composite branch1 = new Branch("branch1");
branch1.addComposite(new Leaf("branch1-leafA"));
branch1.addComposite(new Leaf("branch1-leafB"));
root.addComposite(branch1);
root.display(1);
}
}
測試結果:
後分析
- 個人建議:寫代碼是件幸福的事,So,do it
組合模式,定義是:將對象組合成樹形結構以表示“部分-整體”的層次結構。組合模式使得用戶對單個對象和組合對象的使用具有一致性。
從定義上看,感覺太專業了。實際上就是所有子類實現同一個接口,該接口中有對實現類操作的方法,如上述中add方法,remove方法,這兩個方法表明可以嵌套實現了該接口的實現類。這樣就實現了自由組合。一個具體類可以在自身中又添加實現了該接口的實現類。
什麼地方使用組合模式比較好?當發現需求中體現部分與整體層次的結構時,以及你希望客戶可以忽略組合對象與單個對象的不同,統一地使用組合結構中的所有對象時,就應該考慮組合模式了。
其他例子:參考自《大話設計模式》一個公司有財務部、人力資源部,還有分公司,分公司下面還有財務部、人力資源部以及分公司…
注:以上文章僅是個人總結,若有不當之處,望不吝賜教