ちょっとずつ追加していきます。
Adapter
using System;
public class Hello{
public static void Main(){
OldMediaPlayer oldPlayer = new OldMediaPlayer();
MediaPlayer player = new MediaAdapter(oldPlayer);
player.play("song.mp3");
}
}
//既存のインターフェース(Adaptee)
class OldMediaPlayer
{
public void playOldMedia(string fileName)
{
Console.WriteLine("Playing old media:" + fileName);
}
}
//新しいインターフェース(Target)
interface MediaPlayer
{
void play(string fileName);
}
//Adapterクラス
class MediaAdapter : MediaPlayer
{
private OldMediaPlayer oldMediaPlayer;
public MediaAdapter(OldMediaPlayer oldMediaPlayer)
{
this.oldMediaPlayer = oldMediaPlayer;
}
public void play(string fileName)
{
oldMediaPlayer.playOldMedia(fileName);
}
}
解説
このコードのMediaAdapter
クラスは、アダプターデザインパターンにおける「アダプター」の役割を担っています。
アダプターは、互換性のない2つのインターフェースを橋渡しする仲介役のことです。
アダプタークラスの役割
MediaAdapter
クラスの役割を、日常生活の例で考えてみましょう。
状況:
あなたは最新のメディアプレイヤー(MediaPlayer
インターフェース)を使いたい。このプレイヤーは、play
というボタン(メソッド)を持っています。
しかし、あなたが持っている古いメディアデバイス(OldMediaPlayer
)は、playOldMedia
という別のボタンしかありません。
このままでは、最新プレイヤーのplay
という指示を、古いデバイスは理解できません。そこで、アダプターが登場します。
アダプターの働き:
MediaAdapter
クラスは、このギャップを埋めるための通訳者(アダプター)です。
古いデバイスを保持する:
MediaAdapter
は、内部に古いデバイスのインスタンス(oldMediaPlayer
)を持っています。
新しいインターフェースを実装する:
MediaAdapter
は、最新プレイヤーのMediaPlayer
インターフェースを実装します。
これにより、外部からはplay
というボタンを持っているように見えます。
指示を変換する:
MediaAdapter
のplay
メソッドが呼び出されると、その内部で古いデバイスのplayOldMedia
メソッドを呼び出します。
これにより、外部のコードはMediaPlayer
インターフェースを通じてplay
メソッドを呼び出すだけで、アダプターが裏側で古いデバイスのplayOldMedia
メソッドに処理を振り分けてくれます。
まとめると、MediaAdapter
は、古いデバイス(OldMediaPlayer
)を、新しいインターフェース(MediaPlayer)のルールに適合させるための「変換機」として機能しているのです。
これにより、既存の古いコードを活かしつつ、新しいシステムに統合することが可能になります。
サイト