public interface Component { public void printStruct(String preStr); } public class Leaf implements Component { /** * 葉子對象的名字 */ private String name; /** * 構造方法,傳入葉子對象的名稱 * * @param name * 葉子對象的名字 */ public Leaf(String name) { this.name = name; } /** * 輸出葉子對象的結構,葉子對象沒有子對象,也就是輸出葉子對象的名字 * * @param preStr * 前綴,主要是按照層級拼接的空格,實現向後縮進 */ @Override public void printStruct(String preStr) { // TODO Auto-generated method stub System.out.println(preStr + "-" + name); } } public class Composite implements Component { /** * 用來存儲組合對象中包含的子組件對象 */ private List<Component> childComponents = new ArrayList<Component>(); /** * 組合對象的名字 */ private String name; /** * 構造方法,傳入組合對象的名字 * * @param name * 組合對象的名字 */ public Composite(String name) { this.name = name; } /** * 彙集管理方法,增長一個子構件對象 * * @param child * 子構件對象 */ public void addChild(Component child) { childComponents.add(child); } /** * 彙集管理方法,刪除一個子構件對象 * * @param index * 子構件對象的下標 */ public void removeChild(int index) { childComponents.remove(index); } /** * 彙集管理方法,返回全部子構件對象 */ public List<Component> getChild() { return childComponents; } /** * 輸出對象的自身結構 * * @param preStr * 前綴,主要是按照層級拼接空格,實現向後縮進 */ @Override public void printStruct(String preStr) { // 先把本身輸出 System.out.println(preStr + "+" + this.name); // 若是還包含有子組件,那麼就輸出這些子組件對象 if (this.childComponents != null) { // 添加兩個空格,表示向後縮進兩個空格 preStr += " "; // 輸出當前對象的子對象 for (Component c : childComponents) { // 遞歸輸出每一個子對象 c.printStruct(preStr); } } } } public class Client { public static void main(String[] args) { Composite root = new Composite("服裝"); Composite c1 = new Composite("男裝"); Composite c2 = new Composite("女裝"); Leaf leaf1 = new Leaf("襯衫"); Leaf leaf2 = new Leaf("夾克"); Leaf leaf3 = new Leaf("裙子"); Leaf leaf4 = new Leaf("套裝"); root.addChild(c1); root.addChild(c2); c1.addChild(leaf1); c1.addChild(leaf2); c2.addChild(leaf3); c2.addChild(leaf4); root.printStruct(""); } }
學習設計模式強烈推薦的博客:java_my_lifejava
代碼地址:lennongit