adaptは日本語で「適合させる」,adapterは日本語で「適合させるもの」という意味になる.adapterパターンは,インターフェースに互換性の無いクラス同士を組み合わせ,インターフェースを変換するためのパターンである.
Adapterパターンの主な要素は以下である.
Adapteeクラスは既存のクラスであり,修正できないものとしている.
ここで,Adapteeクラスを利用したい開発者がいて,その開発者はTargetインターフェースで定義されているメソッドを使いたい(内部の処理はAdapteeクラスのメソッド)ケースがAdapterパターンの使いどころである.
Adapterパターンを実現するための手法として,継承を利用するケースと以上を利用するケースが存在する
java// Target Interface
interface Target {
void request();
}
// Adaptee
class Adaptee {
public void specificRequest() {
System.out.println("Adaptee specificRequest");
}
}
// Adapter
class Adapter extends Adaptee implements Target {
public void request() {
specificRequest();
}
}
// Client
public class AdapterPattern {
public static void main(String[] args) {
Target target = new Adapter();
target.request();
}
}
java// Target Interface
interface Target {
void request();
}
// Adaptee
class Adaptee {
public void specificRequest() {
System.out.println("Adaptee specificRequest");
}
}
// Adapter
class Adapter implements Target {
private Adaptee adaptee = new Adaptee();
public void request() {
adaptee.specificRequest();
}
}
// Client
public class AdapterPattern {
public static void main(String[] args) {
Target target = new Adapter();
target.request();
}
}
処理内容は既存クラスのものを使いたくて,メソッド名だけ変えたいときにAdapterパターンを使う?それってどんな時?
どちらかというと逆で,メソッド名を変えたいのではなく,処理内容を変えたいというケースが個人的にしっくりくる.言い換えると,インターフェースは特定のものを使うのだけど,内部処理は別のクラスのものを使いたいとき.
ただやはり色々なサイトでは,「既存のクラスに対して修正を加えずにインターフェースを変更する」という説明が多い.うーん,わからん.
ちなみにORM(Object Relational Mapping)もアダプターの一種である.