オブジェクト指向における再利用のためのデザインパターン
posted with amazlet at 13.12.11
エリック ガンマ ラルフ ジョンソン リチャード ヘルム ジョン ブリシディース
ソフトバンククリエイティブ
売り上げランキング: 61,798
ソフトバンククリエイティブ
売り上げランキング: 61,798
オブジェクト指向における再利用のためのデザインパターンより、GoFのデザインパターンをJavaで実装してみる。 3回目の今回はガイダンスの”もっとも良く使われているパターン”からAdapterパターンを実装する。
Adapterパターンの主なメリットは以下のとおり。
- 既存の実装を変更せずに互換性のないインタフェースに適合させることができる
本パターンは移譲と継承の2パターンの実装が知られている。 クラス図はそれぞれ以下のとおり。
これは再利用したい既存の実装Adapteeを、Adapteeとは互換性のないITargetインタフェースに適合させる例である。この際に、AdapteeとITargetの間を取り持つのがAdapterだ。(クラス図の赤のクラス)
Adapterクラスを設けることで、既存の実装Adapteeを変更することなく、新しいインタフェースITargetを通じて、Adapteeの実装を再利用することができる。
Javaではクラスの多重継承が許されないので、前者の移譲による実装を使うことが多いと思われる。以下のサンプルコードは移譲によるAdapterパターンの実装である。
実際にAdapterパターンを活用する際には、Adapterが担う役割がどの程度のものになるのかがポイントだ。 最も簡単なのは単にメソッド名を変換するだけのAdapterだ。 しかし、既存の複数のクラスを協調させて新しいインタフェースに適合させるような複雑なAdapterも考えられる。 結局、Adapterパターンを使っても、既存の実装と適合させたいインタフェースが似ても似つかなければ、実装は複雑なものになってしまう。
- Client.java
package com.xmisao.gof.adapter;
public class Client {
public static void main(String[] args) {
Adaptee adaptee = new Adaptee();
ITarget target = new Adapter(adaptee);
target.request();
}
}
- ITarget.java
package com.xmisao.gof.adapter;
public interface ITarget {
public void request();
}
- Adapter.java
package com.xmisao.gof.adapter;
public class Adapter implements ITarget{
Adaptee adaptee;
public Adapter(Adaptee adaptee){
this.adaptee = adaptee;
}
@Override
public void request() {
adaptee.specificRequest();
}
}
- Adaptee.java
package com.xmisao.gof.adapter;
public class Adaptee {
public void specificRequest(){
System.out.println("specificRequest was called.");
}
}
- 実行結果
specificRequest was called.