2010年10月9日土曜日

Adapterパターン - VDMで学ぶデザインパターン

長らく更新しなかった、VDMで学ぶデザインパターン。2つ目はAdapter。VDMのライブラリーが充実してきたら、こういうパターンを使うケースも出てくるかな。
今回は、委譲のパターンで書いてみた。継承のパターンではない。
まずは、既存仕様の立場を取るAdapteeクラス。これが変更できないためにAdapterを使う。
class Adaptee
operations
  public adaptee : () ==> nat
  adaptee() == return 1;
end Adaptee
そして、Adapterのクラス。特徴は以下の通り。
  • 既存仕様である「Adaptee」を使うために、ClientとAdapteeをつなげるクラス
  • 委譲の形で記述しているため、インスタンス変数として、Adapteeを持つ
  • 継承の形で記述するなら、TargetとAdapteeを多重継承した形
    ※継承の形で記述すると、ClientにAdapteeの情報が公開されるため、委譲の形で記述した方が良い
class Adapter is subclass of Target
instance variables
  adpt : Adaptee := new Adaptee();

operations
  public returnNat : () ==> nat
  returnNat() == return adpt.adaptee();
end Adapter
次はクライアントに見えるTargetクラスは以下の通り。JavaとかだとInterfaceで書くんだろうけど、VDM++にはInterfaceがないので、is subclass responsibilityの操作だけの、擬似抽象クラスとした。
class Target
operations
  public returnNat : () ==> nat
  returnNat() == is subclass responsibility;
end Target
で、最後にClientクラス。Adapteeクラスを使いたいんだけど、どうしてもreturnNatという操作名で使いたいとする。
class Client
instance variables
  a : Target;

operations
  public t : () ==> nat
  t() == (
    a := new Adapter();
    return a.returnNat();
  );
end Client
上記2つのクラスをVDMToolsで動作させるには、VDMToolsのインタープリタで以下のコマンドを入力してください。
>> init
>> print new Client().t()

0 コメント:

コメントを投稿