GoFのデザインパターンをJavaで実装して理解する Adapter編
タグ: GoFjava / 初版公開: 2014-01-09
オブジェクト指向における再利用のためのデザインパターン
エリック ガンマ ラルフ ジョンソン リチャード ヘルム ジョン ブリシディース
ソフトバンククリエイティブ
売り上げランキング: 61,798

オブジェクト指向における再利用のためのデザインパターンより、GoFのデザインパターンをJavaで実装してみる。 3回目の今回はガイダンスの”もっとも良く使われているパターン”からAdapterパターンを実装する。

Adapterパターンの主なメリットは以下のとおり。

  • 既存の実装を変更せずに互換性のないインタフェースに適合させることができる

本パターンは移譲と継承の2パターンの実装が知られている。 クラス図はそれぞれ以下のとおり。

Adapter

これは再利用したい既存の実装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.