LoginSignup
1
3

More than 5 years have passed since last update.

【デザインパターン】 Bridgeパターン

Last updated at Posted at 2015-07-05

概要

抽出されたクラスと実装を分離して、それらを独立して変更できるようにするパターン

以下の4種類のクラスからなる
1. Abstractionクラス(抽出されたクラスのインターフェイスを定義)
2. RefinedAbstractionクラス(1.で定義したインターフェイスを拡張する)
3. Imprementorクラス(実装を行うクラスのインターフェイスを定義する)
4. ConcreteImprementorクラス(3.で定義したインターフェイスを実装する)

具体例と実装

様々なOSでの表計算を例にすると

上記1~4はそれぞれ
1. 表計算生成抽象クラス
2. 表計算ファイル生成クラス
3. 表計算実装抽象クラス
4. Mac表計算クラス、Windows表計算クラス

が対応する。
コードの詳細は以下

spreadsheet_generator.rb
class SpreadsheetGenerator
  def initialize(klass)
    @spreadsheet_generator = klass.new
  end

  def generate_spreadsheet(data)
    # 表計算オブジェクト出力
    @spreadsheet_generator.generate_spreadsheet(data)
  end
end
spreadsheet_file_generator.rb
class SpreadsheetFileGenerator < SpreadsheetGenerator
  def generate_spreadsheet_file
    # 表計算オブジェクトから表計算ファイルを作成、出力
  end
end
spreadsheet_generate_impl
class SpreadsheetGenerateImpl
  def generate_spreadsheet(data)
  end
end
mac_spreadsheet_generator
class MacSpreadsheetGenerator < SpreadsheetGenerateImpl
  def generate_spreadsheet(data)
    # dataからmacの表計算オブジェクト作成
  end
windows_spreadsheet_generator
class WindowsSpreadsheetGenerator < SpreadsheetGenerateImpl
  def generate_spreadsheet(data)
    # dataからwindowsの表計算オブジェクト作成
  end

メリット

  • インターフェイスと実装を分離し、抽出されたクラスの実装を実行時に決定できる
  • インターフェイスと実装を独立に拡張出来る
  • クライアントから実装の詳細を隠蔽することが出来る

まとめ

インターフェイスと実装を分離し、それぞれを独立に拡張、提供するパターン
機能追加により生まれる拡張階層と,サポート環境追加により生まれる実装階層を,分離して別個に管理したい場合に用いる

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3