🐢
Composite
Composite
パターンは、オブジェクトのグループを、個別のオブジェクトと同じ方法で扱えるようにするデザインパターンです。つまり、単一のオブジェクトとオブジェクトのコレクションの両方を一貫した方法で扱うことができます。
主要な構成要素:
- Component (コンポーネント): すべての具体的なクラスと抽象クラスに共通のインターフェースや抽象クラス。
- Leaf (葉): 単一のオブジェクトを表すコンポーネントの具体的なクラス。
- Composite (コンポジット): 子コンポーネントを持つコンポーネントの具体的なクラス。
例:
ファイルとディレクトリの階層を考えてみましょう。ディレクトリはファイルや他のディレクトリを含むことができます。
-
Component:
from abc import ABC, abstractmethod class FileComponent(ABC): @abstractmethod def show(self): pass
-
Leaf:
class FileLeaf(FileComponent): def __init__(self, name): self.name = name def show(self): print(f"File: {self.name}")
-
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
利点:
- 単純化: クライアントは、個別のオブジェクトとオブジェクトのコレクションの両方を同じ方法で扱うことができます。
- 一般性: 新しい種類の要素を追加するのが容易です。
Composite
パターンは、部分-全体の階層を持つオブジェクトをモデル化するときや、オブジェクトとオブジェクトのグループを一貫して扱いたいときに特に役立ちます。
Discussion