本記事では、GoFが提唱した23のデザインパターンのうち、Adapterパターンについて解説します。
Adapterパターンは、互換性のないインターフェースを接続するために使用され、既存のコードを変更することなく新しい機能を統合できるという特徴を持っています。
記事の内容は、Adapterパターンの概念、使い方、Javaでの実装サンプルに分けて説明しています。
Adapterとは
Adapterパターンは、異なるインターフェースを持つクラス同士を接続するために使用されます。
Adapterパターンの基本概念
Adapterパターンは、互換性のないインターフェース同士をつなぎ、異なるインターフェースを持つクラスを、あたかも同じインターフェースを持っているかのように振る舞わせるデザインパターンです。
これにより、既存のコードに手を加えることなく、新しい機能やクラスを統合することができ、特にレガシーコードとの統合や外部ライブラリの使用において有効です。
Adapterの使い方
次に、Adapterパターンをどのように使用するかについて説明します。
Adapterの実用例
Adapterパターンは、互換性のない既存システムを新しいシステムに統合する場合に便利です。
例えば、ある古いAPIを新しいインターフェースに適合させる場合や、異なるフォーマットのデータをやり取りする際に用いられます。
また、サードパーティ製ライブラリを既存システムに取り込む際にも、Adapterパターンを活用することができます。
クラス図の概要
Adapterパターンの構成は以下の通りです。
Adapter実装サンプル
最後に、AdapterパターンのJavaによる実装例を紹介します。
JavaでのAdapter実装例
ここでは、古いメディアプレーヤー(Adaptee)を新しいインターフェース(Target)に適合させるAdapterの実装例を示します。
// 既存のインターフェース(Adaptee)
class OldMediaPlayer {
public void playOldMedia(String fileName) {
System.out.println("Playing old media: " + fileName);
}
}
// 新しいインターフェース(Target)
interface MediaPlayer {
void play(String fileName);
}
// Adapterクラス
class MediaAdapter implements MediaPlayer {
private OldMediaPlayer oldMediaPlayer;
public MediaAdapter(OldMediaPlayer oldMediaPlayer) {
this.oldMediaPlayer = oldMediaPlayer;
}
@Override
public void play(String fileName) {
oldMediaPlayer.playOldMedia(fileName);
}
}
// クライアントコード
class Client {
public static void main(String[] args) {
OldMediaPlayer oldPlayer = new OldMediaPlayer();
MediaPlayer player = new MediaAdapter(oldPlayer);
player.play("song.mp3");
}
}
このコード例では、古いメディアプレーヤー(OldMediaPlayer)を新しいメディアプレーヤーのインターフェース(MediaPlayer)に適合させるために、Adapterクラス(MediaAdapter)を使用しています。
まとめ
Adapterパターンは、既存のコードに手を加えずに、異なるインターフェースを持つクラスを接続するためのデザインパターンです。
特にレガシーコードや外部ライブラリとの統合において、その利便性が際立ちます。
本記事では、Adapterパターンの概念、使用方法、そしてJavaでの実装例について詳しく説明しました。
Adapterパターンを効果的に活用することで、柔軟なコード設計が可能となり、メンテナンス性も向上します。