デザインパターン-Bridge



Bridgeパターンとは

Bridgeパターンは、「橋渡し」のクラスを用意することによって、クラスを複数の方向に拡張させることを目的とするデザインパターンです。


機能(クラスが保持するメソッドを利用した処理)と実装(処理を実現するためのメソッド)をひとつのクラスにまとめていると、機能や実装の追加を行っていくうちにクラス間の関係がわかりにくくなります。

Bridgeパターンを用いることで、機能の拡張と実装の拡張を別々に管理し、拡張時のクラスの膨張を防ぐことが可能となります。


「図形の描写」を例にすると、以下のように分離させることができます。

  1. 図形という抽象的な側面があり、その図形が描画という振る舞いを持つ。
  2. 図形の種類と描画の方法が増えるに従って、難解な構造になる。
  3. 描画という振る舞いを外に出し、図形と描画を独立させる。
  4. 図形の種類を増やす場合には図形を拡張する。
  5. 描画の方法を増やす場合には描画を拡張する。

Bridgeパターンの利点


構成要素


rubyによるBridgeパターンの実装

すでに利用していたBubbleSortとQuickSortの実行時間を計測するために、Bridgeパターンを用いてTimerクラスを作成します。

SorterクラスとSortImpleクラスが機能クラスの階層と実装クラスの階層を橋渡をします。

#!/usr/bin/env ruby

# Abstraction(抽象化) 
class Sorter
  def initialize(sorter)
    @sorter = sorter
  end
  
  def sort
    @sorter.sort
  end
end

# Implementor(実装者)
#「Abstraction」が使用するメソッドのインタフェースを定義します。
class SortImple
  def sort
  end
end

# ConcreteImplementor(具体的な実装者) 
class QuickSort < SortImple
  def sort
    # QuickSort処理の実装
  end
end

# ConcreteImplementor(具体的な実装者) 
class BubbleSort < SortImple
  def sort
    # BubbleSort処理の実装
  end
end

# RefinedAbstraction(改善した抽象化) 
class Timer < Sorter
  def timer_sort
    start_time = Time.now
    sort
    puts("start :" + start_time.strftime("%H:%M:%S"))
    puts("finish:" + Time.now.strftime("%H:%M:%S"))
  end
end

bstm = Timer.new(BubbleSort.new) # Bubbleソートの時間計測
bstm.timer_sort
qstm = Timer.new(QuickSort.new)  # Quickソートの時間計測
qstm.timer_sort

関連ページ



スポンサード リンク