デザインパターンの一つ、Adapterパターンを勉強してみました。
今回はQtとC++を使って、簡単な(無意味な)GUIアプリを作ってみました。

Adapterパターンを活用できていない気がするアプリを作ってしまった・・
Adapterパターンとは
Adapterパターンとは適合させるという意味をもちますが、お互いに関連のないクラス同士のふるまいを合わせたい時などに使うようです。
例えば、猫クラスとイルカクラスがあるとします。

猫クラスには鳴き声関数がありますが、イルカクラスは鳴き声関数はありません。ただし、鳴き声関数に似た超音波関数を持つとします。
超音波関数も、ある種鳴き声だし、どちらのクラスからも鳴き声関数を呼んだら何かしら返事をしてほしいと期待します。
そこで、Adapterクラスというインタフェースを作成し、鳴き声クラスを仮想関数として定義します。
そして新たにイルカAdapterクラスを実装し、イルカクラスとAdapterクラスを継承し、鳴き声関数にはイルカクラスの超音波関数を呼び出すとします。
こうすることで、猫クラス、イルカAdapterクラスから、鳴き声関数を呼び出すことができることとなりました。
このように、イルカクラスは猫クラスと互いに関連がありませんが(同じ生物という括りでは一緒だけど)、Adapterクラスでふるまいを無理やり合わせることができます。
クラス図

先ほどの例を上記の図に置き換えると、イルカAdapterクラスが、Adapterクラスとなり、イルカクラスがAdapteeクラス、そしてAdapterインタフェースがTargetとなります。
作成したアプリ
人間クラスと宇宙人クラスをそれぞれ呼び出し、日本語で話しかけたら宇宙人も片言の日本語で返事をしてくれるようなアプリとしました。
人間と宇宙人はどちらも生命体という括りでは一緒ですが、言語が違うということで、そこをAdapterを使ってふるまいを合わせるといったことにしてみました。
コードと実行結果


作ってる最中、これでいいのかよくわからなくなってきたが、、、
コードを分解
では、各クラスの説明をしていきます。
mainwindow.h / mainwindow.cpp
ここでは、UI部分の実装やロジックを入れています。
human.h / human.cpp
Humanクラスを定義しています。Humanクラスには、こんにちはと返すsayHello
関数が実装されています。
alien.h / alien.cpp
Alienクラスを定義しています。Alienクラスにも、宇宙人語でコンニチハと返すsayHelloWithALienLanguage
関数が実装されています。
friendly-interface.h / friendly-interface.cpp
仲良く振る舞えるようになるインタフェースクラスとなります。ここでは、仲良くなることで、sayHello
関数が使えるようになります。
alien-adapter.h / alien-adapter.cpp
Alienクラスを継承し、FriendlyInterfaceクラスをインタフェースとして実装するクラスです。
つまり、宇宙人と仲良くなれた結果、このクラスを使えるようになり、sayHello
関数を呼び出すと、宇宙人語でコンニチハと返してくれるようになります。
どういう時に使うのか?
振る舞いの違うクラスを無理やり変えたい場合などにAdapterパターンを使うと良いのかもしれないですね。
元のクラスを書き換えるとなると、膨大にある場合は大変だったりするので、付け加えて調整して直していくって感じでしょうか。

これはわりと業務でも使うかも?
まとめ
Adapterパターンをアプリ作成してまとめてみました。
使いどきは、関連性のないクラス同士の組み合わせで振る舞いを合わせたい場合、こちらのパターンが使えるのではないでしょうか。
他のデザインパターンについてはこちらをご覧ください。
参考サイト

にほんブログ村に参加しております!よろしければクリックお願いします 🙂

にほんブログ村
コメント