ちゃんなるぶろぐ

エンジニア5年生🧑‍💻 オライリーとにらめっこする毎日。

【5分でわかる🍱】TypeScriptでDesign Pattern〜Composite Pattern〜

どうも、ちゃんなるです!

今回は、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);
  }
}

クラス図

サンプルコードのクラス図:Mermaid Live Editorで作成

クラス名 役割
Component 抽象クラス。FileとFolderの共通インタフェースを定義する。
File Leafクラス。ファイルを表現する。
Folder Compositeクラス。フォルダを表現し、Componentオブジェクトを格納する。

Composite Patternの使い道

  • オブジェクトの階層構造が必要な場合
  • クライアントが、個々のオブジェクトとその集合を同一視したい場合

組み合わせられるデザインパターン

  • Iterator Pattern: Composite Patternで構築されたオブジェクトの階層構造を繰り返し処理するために使用されます。

chan-naru.hatenablog.com

  • Visitor Pattern: Composite Patternで構築されたオブジェクトの階層構造に対して、新しい操作を定義するために使用されます。

chan-naru.hatenablog.com

  • Decorator Pattern: Composite Patternと一緒に使うことで、オブジェクトに動的に責務や機能を追加できます。このパターンは、既存のオブジェクトの機能を拡張する際に便利です。

chan-naru.hatenablog.com

  • Strategy Pattern: Composite Patternで構築されたオブジェクトの階層構造に対して、アルゴリズムの動的な変更を容易にすることができます。これにより、アルゴリズムをオブジェクトにカプセル化し、実行時に変更できるようになります。

chan-naru.hatenablog.com

まとめ

Composite Patternは、オブジェクトの階層構造を効率的に構築・操作することができ、非常に便利なデザインパターンです。

ぜひ、あなたのプロジェクトや自社サービスの開発に活用してみてください👍

参考文献

www.oreilly.com

en.wikipedia.org