設計模式組合模式new
阿新 • • 發佈:2019-01-03
轉載請註明地址: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
葉子類.javapackage 組合模式; 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+"-"); } } }
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'
總結:
組合模式不用關心處理的是葉子節點還是分支節點,不用為定義組合使用判斷語句語句。