《Design Patterns》Composite.積跬步系列

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方法,這兩個方法表明可以嵌套實現了該接口的實現類。這樣就實現了自由組合。一個具體類可以在自身中又添加實現了該接口的實現類。
什麼地方使用組合模式比較好?當發現需求中體現部分與整體層次的結構時,以及你希望客戶可以忽略組合對象與單個對象的不同,統一地使用組合結構中的所有對象時,就應該考慮組合模式了。
其他例子:參考自《大話設計模式》一個公司有財務部、人力資源部,還有分公司,分公司下面還有財務部、人力資源部以及分公司…


注:以上文章僅是個人總結,若有不當之處,望不吝賜教

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章