Ruby Compositeパターン


はじめに

構造がきれいな設計のために、デザインパターンを再学習しています。
今回はCompositeパターンを扱います。

環境

Ruby 2.3.0

概要

構造に関するパターンのひとつです。
Compositeパターンは、木構造、階層構造、ツリー構造のオブジェクトを作りたいときに
上位のオブジェクトとか単一のオブジェクトかを考えさえせたくないときに利用できます。

例えば、ディレクトリ(上位オブジェクト)とファイル(単一オブジェクト)の構造の場合に、ディレクトリもファイルも同一視できます。

GoFいわく「全体が部分のように振る舞う」テクニックとのこと。
また、Compositeとは英語で「複合的」という意味です。

コード

Componentを継承して、ファイルとディレクトリを作成しています。

Strategy.rb
class Component
  attr_accessor :name
  def initialize(name)
    @name = name
  end
end

class FileComponent < Component
  def initialize(name)
    super(name)
  end
end

class DirectoryComponent < Component
  def initialize(name)
    super(name)
    @components = []
  end

  def add(component)
    @components << component
  end

  def remove(component)
    @components.delete(component)
  end

end

picture = DirectoryComponent.new("PICTURE")
picture.add(FileComponent.new("child.jpg"))
picture.add(FileComponent.new("car.jpg"))
picture.add(FileComponent.new("landscape.jpe"))

usb = DirectoryComponent.new("UsbDevice")
usb.add(picture)

参考