デザインパターン-Bridge

Bridgeパターンとは

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


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

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


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

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

Bridgeパターンの利点

  • 機能や実装を追加または変更の際に、既存のクラスに影響を与えない。
  • 機能または実装という単位でクラスが分割されているため、理解しやすい設計になる。

構成要素

  • Abstraction(抽象化)
    • 機能追加の継承関係の最上位クラスです。
    • 「Implementor」を内部に保持し、「Implementor」のメソッドを使用した基本的な機能を提供します。
  • RefinedAbstraction(改善した抽象化)
    • 「Abstraction」を機能追加したクラスです。
    • 「Abstraction」とは、機能追加の継承関係にあります。
  • Implementor(実装者)
    • 機能実装の継承関係の最上位クラスです。
    • 「Abstraction」が使用するメソッドのインタフェースを定義します。
  • ConcreteImplementor(具体的な実装者)
    • 「Implementor」が定めたインタフェースを実装します。

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

関連ページ