前回に引き続き「Adapterパターン」です。
前回は「継承型」のAdapterパターンを紹介しました。今回は「委譲型」のAdapterパターンを紹介します。
まずはおさらいとして、Adapterで適合させたいインターフェイス、クラスを見てみましょう。
// しゃべれるインターフェース
interface ISpeakable
{
void Speak();
}
// 人間クラス
class Human : ISpeakable
{
// しゃべる
public void Speak()
{
Console.WriteLine("こんにちは");
}
}
// アヒルクラス
class Duck
{
// 鳴く
public void Quack()
{
Console.WriteLine("クワックワッ");
}
}
今回の目的はDuckクラスをISpeakableインターフェイスを使って呼び出すようにすることです。
そのためには、ISpeakableインターフェイスを実装したクラスの内部にDuckクラスのオブジェクトを持たせ、SpeakメソッドではそのオブジェクトのQuackメソッドを呼び出す(委譲)ようにします。
それでは、委譲型のAdapterの例を以下に示します。
// 委譲Adapter
class DelegateSpeakAdapter : ISpeakable
{
// 内部にアヒル型を持つ
private Duck duck = new Duck();
// しゃべる
public void Speak()
{
// 内部に持ったアヒルを鳴かせる <- ここのところが委譲
this.duck.Quack();
}
}
実行結果は以下の通りです。
さて、インターフェイスを実装するクラス内にオブジェクトを含有する構造はDecoratorパターンに似ています。しかし、Decoratorパターンがクラスの「装飾」を目的としていたのに対し、Adapterパターンは既存のクラスにインターフェイスを「適合」させることが目的です。
したがって、パターンを適用する場合は明確に使い分けるように注意しなければなりません。
以上でAdapterパターンは終わりです。
次回はAdapterパターンと目的が似ているFacadeパターンを取り上げるつもりです。