ちょっとずつ追加していきます。
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)のルールに適合させるための「変換機」として機能しているのです。
これにより、既存の古いコードを活かしつつ、新しいシステムに統合することが可能になります。
サイト