03 Mar 2014, 12:21

[RubyTk]コンポジット・パターン(Composite Pattern)とTkCompositeについてしらべた

RubyTkにTkCompositeというなぞのライブラリがあるので、しらべた。

名前から推測するに、Composite Patternと関係がありそうだ。

Composite Patternとは

Composite Patternとは、Gofのパターンの一つ。

説明はwikipediaに譲るとして、自分の理解では、

再帰的な操作が可能なデータ構造

親子関係のあるデータ構造と素の操作

という感じ。たとえば単方向リスト、木構造などのデータ構造とそれに対する操作。 何だか当たり前のことだ。

登場人物

<div class="outline-text-3" id="text-1-1">
  <ul class="org-ul">
    <li>
      Component(親) 全ての親になるもの
    </li>
    <li>
      Leaf(葉) Leafを持たないもの
    </li>
    <li>
      Composite(枝)Leafを持つもの
    </li>
  </ul>
</div></p>

TkCompositeの使い方

TkCompositeを利用すると、 複数のウィンドウ部品がまとまってできているウィンドウ部品を簡単に作成できるみたい。

以下が、作法。


class Tkhoge < TkWindow
  include TkComposite

  def initialize_composite
    ...
  end
end

@frameがインスタンス変数として利用できる。 この@frameを親にして、この部品たちを組み合わせる(ここがcomposite!)

delegateを利用すると、属性を子の部品に委譲できる。

詳しくは以下のリンクを参照。

サンプル

再生、停止ボタン、エントリフィールドをもつのモックguiを作成してみた。

GUIの親部品、子部品がcompositeのよきサンプル。