woshidan's loose leaf

ぼんやり勉強しています

Adapterパターン

Adapterパターンは去年知った当時は何をしたいのか、メソッドの内容が分かりやすい割に あんまり分からなかったのだけど、最近少しだけ分かる気がした。

インターネット上に転がっているAmazonの商品情報だったりを取得するために、 外部のAPIを利用するとする。

利用したいAPIを提供しているのは楽天市場だったり、ヤフオクだったりするかもしれない。 とにかく、アプリケーション上で表示とかの処理では、どのAPIから得た情報も合わせて順位付けを行いたい。

Amazonの場合は、値段の列がprice(この辺適当)、商品名がproduct_nameかもしれないし、
楽天市場だったら、値段の列はprice(この辺適当)で共通だけれど、商品名はnameかもしれない。

そもそもAPIで返ってくるデータの構造が、JSONで揃っているか、 JSONの形式が揃っているか(配列かハッシュか...)などは違うかもしれない。

この場合、アプリケーションの表示やソートの処理の部分で、 それぞれのAPIに合わせた処理を書くのは辛い。

本来のソート処理が見えにくくなる。

データの取得元の違いに合わせて、ロジックの中に条件分岐が必要となった、 がAdapterパターンを思い出す条件かもしれない。

上の例の場合、

Amazon APIからデータを取得するクラス(Adaptee) - Amazon APIから取得したデータを整形するクラス(Adapter) ---|
楽天APIからデータを取得するクラス(Adaptee)    - 楽天APIから取得したデータを整形するクラス(Adapter) -------+--整形されたデータを利用するクラス(Client)
ヤフオクAPIからデータを取得するクラス(Adaptee) - ヤフオクAPIから取得したデータを整形するクラス(Adapter) ---|

3つのAdapterパターンが継承するモジュール(共通部分の処理のみを書き、分岐部分は super の後に書く感じ)(Target)

こういう構成になる気がする。

ここのお話が参考になりました。というか、触発されて書きました。

http://qiita.com/joker1007/items/9da1e279424554df7bb8