1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

デザインパターン学習メモ:「Adapter」

Posted at

このパターンの目的

GoF本より引用する。

 あるクラスのインタフェースを、クライアントが求める他のインタフェースに変換する。Adapterパターンは、インタフェースに互換性のないクラス同士を組み合わせることができるようにする。(P.149)

このパターンによって、すでに存在するクラスを任意のインタフェースに適合させることができる。

実装例

『アジャイルソフトウェア開発の奥義』(P.404) を参考に作成。

Light.java
// 自由に改変できないサードパーティ製ライブラリに含まれるクラスとする
// Adapteeの役割
public class Light {
	public void on() {
		// 何らかの実装
	}

	public void off() {
		// 何らかの実装
	}
}
Switchable.java
// 開発中のプロジェクトで要求されるインタフェース
// Targetの役割
public interface Switchable {
	void turnOn();
	void turnOff();
}
LightAdapter.java
// Adapterの役割
public class LightAdapter implements Switchable {

	private Light light;

	public LightAdapter(Light light) {
		this.light = light;
	}

	@Override
	public void turnOn() {
		light.on();
	}

	@Override
	public void turnOff() {
		light.off();
	}

使用するシーン

開発中のプロジェクトにおいて、Switchableインタフェースを用いてポリモーフィズムに則った動作を行うとしているとする。

サードパーティ製ライブラリにLightクラスを見つけ、ほしい機能が揃っていたのでぜひこれを使いたいが、このクラスはもちろんSwitchableインタフェースを実装していない。

そのようなときに、LightAdapterクラスを作成し、SwitchableのインタフェースからLightクラスの機能を呼び出すことで、望み通りのインタフェースとLightクラスの機能が手に入る。

2種類のAdapter

オブジェクトに適用するAdapterパターン

  • 実装例で示したもの
  • AdapterがAdapteeのオブジェクトをクラス内部に持ち、必要な処理を委譲する

クラスに適用するAdapterパターン

  • 多重継承を用いて、TargetとAdapteeを継承するAdapterクラスを作成する
  • 多重継承を認めるC++などで使用可能

Javaでは「オブジェクトに適用するAdapterパターン」を使うことになるだろう。
それぞれの利点については、GoF本を参照してほしい。

参考文献

  • エリック ガンマ、ラルフ ジョンソン、リチャード ヘルム、ジョン プリシディース(1999)『オブジェクト指向における再利用のためのデザインパターン 改訂版』本位田 真一、吉田 和樹 監訳、SBクリエイティブ
  • ロバート・C・マーチン(2004)『アジャイルソフトウェア開発の奥義 第2版 オブジェクト指向開発の神髄と匠の技』瀬谷啓介訳、SBクリエイティブ
1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?