今日の目標
Adaptorパターンに触れてみる
使うもの
ではスタート
はじめに
Adaptorパターンとは何か。まずはWikipediaを見てみよう。
Adapter パターン(アダプター・パターン)とは、GoF(Gang of Four; 4人のギャングたち)によって定義されたデザインパターンの1つである。Adapter パターンを用いると、既存のクラスに対して修正を加えることなく、インタフェースを変更することができる。Adapter パターンを実現するための手法として継承を利用した手法と委譲を利用した手法が存在する。
既存クラスがあって、そいつに手を加えることなく、新しい呼び出し方で呼べるようにしよう!ということらしい。単なる中継役と考える。
本のサンプルを試してみる
- Banner
- もともと存在するクラス
- Print(Interface)
- 新しく呼び出し方が指定されているインタフェース
- PrintBanner
- BannerとPrintとの仲介役
package banner;
public class Banner {
private String str;
public Banner(String str) {
this.str = str;
}
public void showWithParen() {
System.out.println("(" + str + ")");
}
public void showWithAster() {
System.out.println("*" + str + "*");
}
}
package banner;
public interface Print {
public abstract void printWeak();
public abstract void printStrong();
}
package banner;
public class PrintBanner extends Banner implements Print {
public PrintBanner(String str) {
super(str);
}
@Override
public void printWeak() {
showWithParen();
}
@Override
public void printStrong() {
showWithAster();
}
}
package banner;
public class Main {
public static void main(String[] args) {
Print p = new PrintBanner("Hello");
p.printStrong();
p.printWeak();
}
}
こんな感じ。
Adapterの実装方法は継承と委譲という2パターンあるが、上記は継承パターン(PrintBannerがBannerをextendsしている)で作成している。
PrintBanner(絵の中ではAdapterになってるが)が生まれた経緯はこんな感じか。
まとめ
Adapterパターンは、こんな場合に使う。
- 今までの呼び方じゃなくて、違う呼び方で呼びたいなあ
- でも今までのソースに手を加えたくないなあ
- そんなときにAdaptor!
また、継承と委譲の2パターンがあるので状況によって使い分ける(委譲のソースコードは「使うもの」に記したサンプルプログラムを参照のこと)。
途中で「Adapterは中間管理職だ」と思った。お疲れAdapter。