1. 程式人生 > >設計模式組合模式new

設計模式組合模式new

轉載請註明地址:http://blog.csdn.net/droyon/article/details/21228537

組合模式:允許你將物件組合成樹形結構來表現 “整體/部分” 層次結構。組合能讓客戶以一致的方式處理個別對象以及物件組合。

組合模式解決了整體與部分一致對待的問題。

透明方式:葉子結點和分支節點繼承自同一父類,葉子和分支具有同一介面。優點:葉子結點和分支節點對外界沒有區別可以統一介面呼叫,缺點:父類方法在葉子中實現無意義。

安全方式:葉子介面不實現父類方法,這種方式介面帶外界不透明,在使用時需要增加判斷邏輯。不推薦。

類圖:


案例程式碼:

行為方法.java

package 組合模式;

import java.util.ArrayList;

public abstract class 行為類 {
	protected ArrayList<行為類> mList = new ArrayList<行為類>(); 
	
	protected String name;
	
	public 行為類(String name){
		this.name = name;
	}
	
	public abstract void add(行為類 component);
	
	public abstract void remove(行為類 component);
	
	public abstract void Display(String subTab);
}

分支類.java
package 組合模式;

public class 分支類 extends 行為類{

	public 分支類(String name) {
		super(name);
	}

	@Override
	public void add(行為類 component) {
		mList.add(component);
	}

	@Override
	public void remove(行為類 component) {
		mList.remove(component);
	}

	@Override
	public void Display(String subTab) {
		System.out.println(subTab+"'"+name+"'");
		for(行為類 b:mList){
			b.Display(subTab+"-");
		}
	}

}
葉子類.java
package 組合模式;

public class 葉子類 extends 行為類{

	public 葉子類(String name) {
		super(name);
	}

	@Override
	public void add(行為類 component) {
	}

	@Override
	public void remove(行為類 component) {
	}

	@Override
	public void Display(String subTab) {
		System.out.println(subTab+"'"+name+"'");
	}

}

組合模式測試類
package 組合模式;

/**
 * 
 *       葉子a   葉子b 
 *          \   /
 *            |
 *          枝幹A  枝幹B
 *             \   / 
 *               |
 *            我是大樹
 * @author wanghl
 *
 */
public class 組合模式 {
	public static void main(String args[]){
		分支類 大樹 = new 分支類("我是大樹");
		
		分支類 枝幹A = new 分支類("枝幹A");
		分支類 枝幹B = new 分支類("枝幹B");
		大樹.add(枝幹A);
		大樹.add(枝幹B);
		
		葉子類  葉子A1a = new 葉子類("枝幹A1的葉子a");
		葉子類  葉子A1b = new 葉子類("枝幹A1的葉子b");
		枝幹A.add(葉子A1a);
		枝幹A.add(葉子A1b);
		
		大樹.Display("-");
		
		System.out.println("-----------------------------------------");
		
		分支類 大棗樹 = new 分支類("我是大棗樹");
		分支類 枝幹 = new 分支類("棗樹枝幹");
		葉子類  大棗1 = new 葉子類("大棗1");
		葉子類  大棗2 = new 葉子類("大棗2");
		葉子類  大棗3 = new 葉子類("大棗3");
		
		枝幹.add(大棗1);
		枝幹.add(大棗2);
		枝幹.add(大棗3);
		
		大棗樹.add(枝幹);
		
		大棗樹.Display("-");
	}
}

列印輸出:
-'我是大樹'
--'枝幹A'
---'枝幹A1的葉子a'
---'枝幹A1的葉子b'
--'枝幹B'
-----------------------------------------
-'我是大棗樹'
--'棗樹枝幹'
---'大棗1'
---'大棗2'
---'大棗3'
總結:

組合模式不用關心處理的是葉子節點還是分支節點,不用為定義組合使用判斷語句語句。