##概要
抽出されたクラスと実装を分離して、それらを独立して変更できるようにするパターン
以下の4種類のクラスからなる
- Abstractionクラス(抽出されたクラスのインターフェイスを定義)
- RefinedAbstractionクラス(1.で定義したインターフェイスを拡張する)
- Imprementorクラス(実装を行うクラスのインターフェイスを定義する)
- ConcreteImprementorクラス(3.で定義したインターフェイスを実装する)
##具体例と実装
様々なOSでの表計算を例にすると
上記1~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
##メリット
- インターフェイスと実装を分離し、抽出されたクラスの実装を実行時に決定できる
- インターフェイスと実装を独立に拡張出来る
- クライアントから実装の詳細を隠蔽することが出来る
##まとめ
インターフェイスと実装を分離し、それぞれを独立に拡張、提供するパターン
機能追加により生まれる拡張階層と,サポート環境追加により生まれる実装階層を,分離して別個に管理したい場合に用いる