Adapterパターン
AdapterパターンまたはWrapperパターン
「すでに提供されているもの」と「必要なもの」の間の「ずれ」を埋めるようなデザインパターン
登場人物
Target
Print class or Print interfaceが相当
Client
Main classが相当し、Targetのメソッドを使う
Adaptee
Banner classが相当し、Adapt-ee(適合される側)
Adapter
PrintBannter classが相当し、Adapteeのメソッドを使ってTargetを満たすのが目的
2つの種類
クラスによるAdapterパターン(継承)
Mainクラスを変更することなくPrintBannerクラスの実装を変更することができる
code:Main.java
public class Main {
public static void main(String[] args) {
// PrintBannerのインスタンスをPrint Interface型の変数に代入している
Print p = new PrintBanner("Hello");
p.printWeak();
p.printStrong();
}
}
code:Print.java
public interface Print {
public abstract void printWeak();
public abstract void printStrong();
}
code:Banner.java
public class Banner {
private String string;
public Banner(String string) {
this.string = string;
}
public void showWithParen() {
System.out.println("(" + string + ")");
}
public void showWithAster() {
System.out.println("*" + string + "*");
}
}
code:PrintBanner.java
public class PrintBanner extends Banner implements Print {
public PrintBanner(String string) {
super(string);
}
public void printWeak() {
showWithParen();
}
public void printStrong() {
showWithAster();
}
}
インスタンスによるAdapterパターン(移譲)
code:Main.java
public class Main {
public static void main(String[] args) {
Print p = new PrintBanner("Hello");
p.printWeak();
p.printStrong();
}
}
code:Banner.java
public class Banner {
private String string;
public Banner(String string) {
this.string = string;
}
public void showWithParen() {
System.out.println("(" + string + ")");
}
public void showWithAster() {
System.out.println("*" + string + "*");
}
}
code:Print.java
public abstract class Print {
public abstract void printWeak();
public abstract void printStrong();
}
code:PrintBanner.java
public class PrintBanner extends Print {
private Banner banner;
public PrintBanner(String string) {
this.banner = new Banner(string);
}
public void printWeak() {
banner.showWithParen();
}
public void printStrong() {
banner.showWithAster();
}
}
どうしてAdapterを使うのか
既存のモジュールに強い実績があり、そのモジュールを再利用したい時
バグが出たとしても、AdapteeにバグがなければAdapterの問題であることがわかるのでテストが容易
バージョンアップによる古いバージョンとの互換性を保つためにも(以前のバージョンをいじる必要が無い)
関連しているパターン