🐢

Composite

2023/09/10に公開

Composite パターンは、オブジェクトのグループを、個別のオブジェクトと同じ方法で扱えるようにするデザインパターンです。つまり、単一のオブジェクトとオブジェクトのコレクションの両方を一貫した方法で扱うことができます。

主要な構成要素:

  1. Component (コンポーネント): すべての具体的なクラスと抽象クラスに共通のインターフェースや抽象クラス。
  2. Leaf (葉): 単一のオブジェクトを表すコンポーネントの具体的なクラス。
  3. Composite (コンポジット): 子コンポーネントを持つコンポーネントの具体的なクラス。

例:

ファイルとディレクトリの階層を考えてみましょう。ディレクトリはファイルや他のディレクトリを含むことができます。

  1. Component:

    from abc import ABC, abstractmethod
    
    class FileComponent(ABC):
        @abstractmethod
        def show(self):
            pass
    
    
  2. Leaf:

    class FileLeaf(FileComponent):
        def __init__(self, name):
            self.name = name
    
        def show(self):
            print(f"File: {self.name}")
    
    
  3. Composite:

    class DirectoryComposite(FileComponent):
        def __init__(self, name):
            self.name = name
            self.children = []
    
        def add(self, component):
            self.children.append(component)
    
        def show(self):
            print(f"Directory: {self.name}")
            for child in self.children:
                child.show()
    
    

使用方法:

    file1 = FileLeaf("file1.txt")
    file2 = FileLeaf("file2.txt")

    directory = DirectoryComposite("Documents")
    directory.add(file1)
    directory.add(file2)

    directory.show()
    # 出力:
    # Directory: Documents
    # File: file1.txt
    # File: file2.txt

利点:

  1. 単純化: クライアントは、個別のオブジェクトとオブジェクトのコレクションの両方を同じ方法で扱うことができます。
  2. 一般性: 新しい種類の要素を追加するのが容易です。

Composite パターンは、部分-全体の階層を持つオブジェクトをモデル化するときや、オブジェクトとオブジェクトのグループを一貫して扱いたいときに特に役立ちます。

Discussion