どうも、ちゃんなるです!
今回は、Composite Patternを紹介します🖐️
概要
Composite Patternは、オブジェクトを木構造で表現し、個々のオブジェクトとその集合を同一視することができるデザインパターンです🌲
クライアントが透過的にオブジェクトを扱えるので、非常に便利です。
Compositeは子要素を持つオブジェクト、Leafは子要素を持たないオブジェクトを指します。まさに前者がフォルダ、後者はファイルみたいなイメージ👀
今回示すプログラムの設計
ファイルシステムを例に、Composite Patternの実装方法を説明します。
ここでは、ファイル(File)とフォルダ(Folder)を表現するクラスを作成し、それらを木構造で表現します。
サンプルコード
abstract class Component { abstract getName(): string; abstract getSize(): number; } class File extends Component { constructor(private name: string, private size: number) { super(); } getName(): string { return this.name; } getSize(): number { return this.size; } } class Folder extends Component { private children: Component[] = []; constructor(private name: string) { super(); } add(component: Component): void { this.children.push(component); } getName(): string { return this.name; } getSize(): number { return this.children.reduce((acc, child) => acc + child.getSize(), 0); } }
クラス図
クラス名 | 役割 |
---|---|
Component |
抽象クラス。FileとFolderの共通インタフェースを定義する。 |
File |
Leafクラス。ファイルを表現する。 |
Folder |
Compositeクラス。フォルダを表現し、Componentオブジェクトを格納する。 |
Composite Patternの使い道
- オブジェクトの階層構造が必要な場合
- クライアントが、個々のオブジェクトとその集合を同一視したい場合
組み合わせられるデザインパターン
Iterator Pattern
:Composite Pattern
で構築されたオブジェクトの階層構造を繰り返し処理するために使用されます。
Visitor Pattern
:Composite Pattern
で構築されたオブジェクトの階層構造に対して、新しい操作を定義するために使用されます。
Decorator Pattern
:Composite Pattern
と一緒に使うことで、オブジェクトに動的に責務や機能を追加できます。このパターンは、既存のオブジェクトの機能を拡張する際に便利です。
Strategy Pattern
:Composite Pattern
で構築されたオブジェクトの階層構造に対して、アルゴリズムの動的な変更を容易にすることができます。これにより、アルゴリズムをオブジェクトにカプセル化し、実行時に変更できるようになります。
まとめ
Composite Patternは、オブジェクトの階層構造を効率的に構築・操作することができ、非常に便利なデザインパターンです。
ぜひ、あなたのプロジェクトや自社サービスの開発に活用してみてください👍