Java 之 合成模式

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

相關文章
相關標籤/搜索