Adapter
適合者
Adapterパターンはその名の通り、クラスのインターフェースを「適合」させるためのパターンです。
ベンダーが作成したクラスなど、手を加えられないクラスに対して、統一したインターフェースを実現したい場合に用います。
例をあげましょう。まず、以下のようなインターフェイスがあったとしましょう。
// しゃべれるインターフェース
interface ISpeakable
{
void Speak();
}
そして、ISpeakableインターフェイスを実装した人間クラスがあります。
// 人間クラス
class Human : ISpeakable
{
// しゃべる
public void Speak()
{
Console.WriteLine("こんにちは");
}
}
今回は、次のようなDuckクラスも、Humanクラスと同じように使用したいと考えています。
// アヒルクラス
class Duck
{
// 鳴く
public void Quack()
{
Console.WriteLine("クワックワッ");
}
}
こういったときAdapterパターンを使ってDuckに適合するAdapterクラスを作成します。
なお、Adapterパターンには大きく分けて、「継承型」と「委譲型」があります。今回は「継承型」を紹介します。
// 継承Adapter
class InheritanceSpeakAdapter : Duck, ISpeakable
{
// しゃべる
public void Speak()
{
// 基底クラスのメソッドを呼び出す
Quack();
}
}
継承型のAdapterパターンでは、インターフェースを適合させたいクラスを継承した上で、インターフェイスを実装します。
そして、インターフェイスのメソッドを実装する際、基底クラスのメソッドを呼び出すように設定します。
それでは、実行してみましょう。
class Program
{
static void Main(string[] args)
{
// 人間がしゃべる
{
var speaker = new Human();
speaker.Speak();
}
// アヒルがしゃべる
{
var speaker = new InheritanceSpeakAdapter();
speaker.Speak();
}
}
}
同一の呼び出し方で、人間とアヒルにしゃべらせることができました。
次回は委譲型のAdapterパターンを紹介します。