サーチ…


前書き

Compositeでは、個々のオブジェクトとオブジェクトの構成を一様に扱うことができます。たとえば、ファイルシステムを操作するプログラムを考えてみましょう。ファイルは単純なオブジェクトであり、フォルダはファイルとフォルダの構成です。しかし、例えば、両方ともサイズ、名前などの機能を持っています。ファイルシステムリソースインタフェースを定義することにより、ファイルオブジェクトとフォルダオブジェクトの両方を一様に扱う方が簡単で便利です

備考

複合パターンは、オブジェクトの一部分全体が存在し、クライアントがリーフ(単純オブジェクト)またはブランチ(複合オブジェクト)であるという事実にかかわらず、オブジェクトを均一に処理する必要がある場合に適用されます。

ダムファイルマネージャの擬似コード

/* 
* Component is an interface 
* which all elements (files,
* folders, links ...) will implement
*/
class Component
{
public:
    virtual int getSize() const = 0;
};

/*
* File class represents a file
* in file system.   
*/
class File : public Component
{
public:
    virtual int getSize() const {
        // return file size
    }   
};

/*
* Folder is a component and 
* also may contain files and 
* another folders. Folder is a
* composition of components
*/
class Folder : public Component
{
public:
    void addComponent(Component* aComponent) {
        // mList append aComponent;
    }
    void removeComponent(Component* aComponent) {
        // remove aComponent from mList
    }
    virtual int getSize() const {
        int size = 0;
        foreach(component : mList) {
            size += component->getSize();
        }
        return size;
    } 

private:
    list<Component*> mList;
};


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow