Java設計模式十六:組合模式(Composite Pattern)


組合模式又叫做部分-整體模式,它使我們樹型結構的問題中,模糊了簡單元素和復雜元素的概念,客戶程序可以向處理簡單元素一樣來處理復雜元素,從而使得客戶程序與復雜元素的內部結構解藕.

組合模式可以優化處理遞歸或分級數據結構.有許多關於分級數據結構的例子,使得組合模式非常有用武之地.

類圖:



組成部分:
Component: 為參加組合的對象聲明一個公共接口, 不管是組合還是葉結點.
Leaf: 在組合中表示葉子結點對象,葉子結點沒有子結點.
Composite: 表示參加組合的有子對象的對象, 並給出樹枝購件的行為.

實例:
public abstract class FolderComponent
{
    private String name;

    public String getName()
    {
        return name;
    }

    public void setName(final String name)
    {
        this.name = name;
    }

    public FolderComponent()
    {
    }

    public FolderComponent(final String name)
    {
        this.name = name;
    }

    public abstract void add(FolderComponent component);

    public abstract void remove(FolderComponent component);

    public abstract void display();
}

public class FileLeaf extends FolderComponent
{
    public FileLeaf(final String name)
    {
        super(name);
    }

    @Override
    public void add(final FolderComponent component)
    {
        //...
    }

    @Override
    public void remove(final FolderComponent component)
    {
        //...
    }

    @Override
    public void display()
    {
        System.out.println("FileLeaf:" + this.getName());
    }
}

public class FolderComposite extends FolderComponent
{
    private final List<FolderComponent> components;

    public FolderComposite(final String name)
    {
        super(name);
        this.components = new ArrayList<FolderComponent>();
    }

    public FolderComposite()
    {
        this.components = new ArrayList<FolderComponent>();
    }

    @Override
    public void add(final FolderComponent component)
    {
        this.components.add(component);
    }

    @Override
    public void remove(final FolderComponent component)
    {
        this.components.remove(component);
    }

    @Override
    public void display()
    {
        System.out.println("FolderComposite---name:" + this.getName());
        for (final FolderComponent component : components)
        {
            System.out.println("FolderComposite---component-name:" + component.getName());
        }
    }
}

public class Client
{
    public static void main(final String[] args)
    {
        final FolderComponent leaf = new FileLeaf("runnable file");
        leaf.display();

        final FolderComponent folder = new FolderComposite("new folder");
        folder.add(new FileLeaf("content1 in new folder"));
        folder.add(new FileLeaf("content2 in new folder"));
        folder.display();
    }
}

結果:
FileLeaf:runnable file
FolderComposite---name:new folder
FolderComposite---component-name:content1 in new folder
FolderComposite---component-name:content2 in new folder


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM