【Java】デザインパターンをやってみた 〜 Adapter編 ~

★★★ Live配信告知 ★★★

Azureでクラウドネイティブな開発をするための方法について、世界一わかりみ深く説明致します!!複数回シリーズでお届けしている第7回目は、「どんと来いDocker」をテーマに、なかなかにわかりにくいDockerの概念を優しく紐解きます!!
【2021/10/28(木) 12:00〜13:00】

こんにちは。サイオステクノロジーの川田です。

今回はAdapterパターンについて調べてみました。
参考☞「増補改訂版Java言語で学ぶデザインパターン入門

Adapterとは

「Adapt」とは適応させるという意味です。
適応させると言葉で言われてもパッとしません。

よく例に出てくるのがACアダプタです。簡単に言うとズバリ仲介人です。

ACアダプタはコンセントからくる電気をパソコンで使える電気に変換する役割をしてくれます。

クラス図で考える

先ほどはACアダプタを使って例えてみました。
ではプログラミングではどのように考えるのかクラス図で見てみます。

役割分担
Client :Targetメソッドを使って処理を行う
Target :必要とされるメソッド
Adapter:Adapteeのメソッドを使ってTargetの役割を満たすためのクラス
Adaptee:すでに用意されているメソッドを持っているクラス

AdapterとなるPrintHumanクラスはHumanクラスを継承(extends)し、Printインターフェースを実装(implements)しています。

実装してみる

Adapteeの部分です。

  • Human.java

Targetで必要とされているメソッドを定めています。

  • Print.java

本日の主役、Adapterの役割です。
HumanクラスをextendsしてshowNameとshowBirthdayメソッドを継承しています。
Printインターフェースをimplementsし、printNameとprintBirthdayを実装しています。

  • PrintHuman.java

これらのクラスやインターフェースを利用するmainメソッドは以下の通りです。

  • Main.java

実行結果はこちらです。

MainクラスはPrintインターフェースのprintNameとprintBirthdayメソッドを使っています。
Adapterがどんな実装になっているかなんてMainクラスは知らないのです!
既に提供されているもの、それがHumanクラスだとします。
PrintHumanクラスはHumanクラスの実装を利用できるように変換する役割を担ってくれました。

委譲

先ほどのは継承を使ったAdapterパターンでした。
実はもう一つ、委譲を使ったAdapterパターンもあります。

委譲とは他にゆだね、ゆずるという意味になります。
今回の委譲の表現は「あるメソッドの処理を他のクラスのインスタンスにお任せする」という考えになります。

クラス図(委譲)

右上は先ほど出てきた「継承を使った」クラス図です。
比べてみると赤丸の部分が変わっていることがわかりますね。

実装で確認してみましょう!

実装してみる

Print.javaとPrintHuman.javaを修正します。

  • Print.java

Printはインターフェースではなく、クラスに修正します。

  • PrintHuman.java

1行目ではPrintをextendsしています。
そして2行目でHumanクラスのインスタンスを保持しています。
showNameとshowBirthdayの呼び出し方がhumanフィールドを経由して呼び出していることがわかりますね!

printNameやprintBirthdayメソッドが呼ばれたらHumanクラスのインスタンスにお任せしているということです。
実行結果は変わりません。

まとめ

今回はAdapterパターンの継承と委譲について学びました。
既存のソースをいじらずに修正ができればテストの手間も省けますね!





ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!


ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

Be the first to comment

Leave a Reply

Your email address will not be published.


*