今更デザパタ:Adapter

テストケース

[]require[] []'[][]test/unit[][]'[]
[]require[] []'[][]adapter[][]'[]

[]class [][]TestAdapter[] []<[] []Test[][]::[][]Unit[][]::[][]TestCase[]
  []def [][]setup[]
    []@text[] []=[] []"[][]aaaa[][]"[]
    []@banner[] []=[] []Banner[][].[][]new[][]([][]@text[][])[]
    []@print_banner[] []=[] []PrintBanner[][].[][]new[][]([][]@text[][])[]
  []end[]
  
  []def [][]test_banner[]
    []assert_equal[][]("[][]*[][]#{@text}[][]*[][]",[] []@banner[][].[][]with_aster[][])[]
    []assert_equal[][]("[][]([][]#{@text}[][])[][]",[] []@banner[][].[][]with_paren[][])[]
  []end[]
  
  []def [][]test_print_banner[]
    []assert_equal[][]("[][]*[][]#{@text}[][]*[][]",[] []@print_banner[][].[][]strong[][])[]
    []assert_equal[][]("[][]([][]#{@text}[][])[][]",[] []@print_banner[][].[][]weak[][])[]
  []end[]
[]end[]

そして実装

[]# abstract class[]
[]class [][]Print[]
  []def [][]weak[]
    []raise[] []NotImplementedError[][].[][]new[]
  []end[]
  
  []def [][]strong[]
    []raise[] []NotImplementedError[][].[][]new[]
  []end[]
[]end[]

[]class [][]Banner[]
  []def [][]initialize[][]([][]string[][])[]
    []@string[] []=[] []string[]
  []end[]
  
  []def [][]with_aster[]
    []"[][]*[][]#{@string}[][]*[][]"[]
  []end[]
  
  []def [][]with_paren[]
    []"[][]([][]#{@string}[][])[][]"[]
  []end[]
[]end[]

[]class [][]PrintBanner[] []<[] []Print[]
  []def [][]initialize[][]([][]string[][])[]
    []@banner[] []=[] []Banner[][].[][]new[][]([][]string[][])[]
  []end[]
  
  []def [][]weak[]
    []@banner[][].[][]with_paren[]
  []end[]
  
  []def [][]strong[]
    []@banner[][].[][]with_aster[]
  []end[]
[]end[]

Adapterパターンは、Wrapperとも言うらし。flickrとかGoogleAPIを呼び出すときなんかに、毎回XML-RPCよんだりSOAPよんだりするのは面倒なので、Adapter(Wrapper)でメソッドひとつで呼び出せるようにしたりするわけですね。