デザインパターンを覚えたい (Adapter)
Adaptorパターン
異なる形式のAPI間をつなぐためのパターン。古いバージョンとの互換性の確保や、仕様の異なる外部プログラムの利用とかで使われる。
要するに仲介役となるクラスを対象のプログラムの間に挟む訳だが、方法は2つある。
- 繋ぐ口のインターフェースを用意して、それの実装クラスに接続先のクラスを継承して使う
- 繋ぐ口のクラスを用意して、それの継承クラスに接続先クラスを委譲して使う
個人的は前者の方法の方がしっくりくるかなぁとか思う。設計の段階でインターフェース固めて実際の実装に持っていくという感じになるし、DIとかで中身入れ替えられそうだし。
ごちゃごちゃいってないで実装する。IteratorパターンではC++を使ったのでそれ以外で...そういえばomake入れるときにOCamlが入ってたような。
まずはemacsに設定を加える。
http://www.i.kyushu-u.ac.jp/~bannai/ocaml-intro/
を参考にtuareg-modeを設定。
ざっくり書いてみた。明らかにパターンを適用する言語が間違ってます、本当にありがとうございました。
(まったく関数型っぽくなってないという、OCaml使ったことないんで勘弁してくだしあ><)
ちなみに、少し調べた感じOCamlでインターフェース作る方法がわからなかったので委譲を用いる方法2で実装してます。
(* adapter.ml *) (* adaptee class: このクラスのメソッドを使いたい *) class adaptee = object (self) method call_adaptee = print_string "call adaptee method\n" end;; (* target class: 実際に呼ぶのはこのクラスのメソッド *) class target = object (self) method call_target = print_string "call target method\n" end;; (* adapter class: メソッドをオーバーライドして中身をすり替える *) class adapter = object (self) inherit target as super val mutable adaptee = new adaptee method call_target = adaptee#call_adaptee end;; (* client: 呼び出すところではadapterを使う *) let a = new adapter;; a#call_target;;
実行結果
$ ocaml adapter.ml
call adaptee method
追記
よくよく考えてみると、clientでadapterそんまま呼んでるからtargetの意味がまったくないような。