【デザインパターン】【GoF】【C#】Adapterパターン

目的

 * インタフェースに互換性のないクラス同士を組み合わせること

実現するための手法(2パターン)

 [1] 継承を利用した Adapter パターン
 [2] 委譲を利用した Adapter パターン

[1] 継承を利用した Adapter パターン

実現する方法

 * インターフェースが同じになるようにクラスを間に1枚かませる

利点

 * 既存クラスを変更せずにそのまま利用できる

サンプル

以下のクラス図を参考に作成
http://ja.wikipedia.org/wiki/Adapter_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3#.E7.B6.99.E6.89.BF.E3.82.92.E5.88.A9.E7.94.A8.E3.81.97.E3.81.9FAdapter

Adaptee.cs : 再利用しようとしているクラス

// 再利用しようとしているクラス
public class Adaptee
{
    public void OldMethod()
    {
        Console.WriteLine("OldMethod");
    }
}

ITarget.cs : インターフェース

public interface ITarget
{
    void RequiredMethod();
}

Adapter.cs : インターフェースを適合させるクラス

[1] インターフェースを適合させたいクラスを継承した上で、インターフェイスを実装する
[2] インターフェイスのメソッドを実装する際、基底クラスのメソッドを呼び出すように設定する
// インターフェースを適合させるクラス(継承Adapter)
public class Adapter : Adaptee, ITarget
{
    // RequiredMethod() という新しいメソッドで、
    // 再利用するクラス Adaptee のOldMethod() を利用することができる。
    // 利点:古いクラス Adaptee は、変更せずにそのまま使える。
    public void RequiredMethod()
    {
        // 基底クラスのメソッドを呼び出す
        this.OldMethod();
    }
}

Form1.cs

private void button1_Click(object sender, EventArgs e)
{
    Adapter obj = new Adapter();
    obj.RequiredMethod();
}

参考文献

* 以下のプログラムが分かりやすい
http://blogs.wankuma.com/masaru/archive/2010/03/08/186913.aspx

[2] 委譲を利用した Adapter パターン

実現する方法

 * インターフェイスを実装したクラスの内部に利用したいクラスのオブジェクトを持たせる
 * メソッドではそのオブジェクトから、利用したいクラスのメソッドを呼び出す(委譲)ようにします

サンプル

以下のクラス図を参考に作成
http://ja.wikipedia.org/wiki/Adapter_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3#.E7.B6.99.E6.89.BF.E3.82.92.E5.88.A9.E7.94.A8.E3.81.97.E3.81.9FAdapter

Adaptee.cs : 再利用しようとしているクラス

// 再利用しようとしているクラス
public class Adaptee
{
    public void OldMethod()
    {
        Console.WriteLine("OldMethod");
    }
}

ITarget.cs : インターフェース

public interface ITarget
{
    void RequiredMethod();
}

Adapter.cs : インターフェースを適合させるクラス

★結局、ここだけしか違わない★
// インターフェースを適合させるクラス
public class Adapter : ITarget
{
    private Adaptee adaptee = new Adaptee();

    public void RequiredMethod()
    {
        adaptee.OldMethod();
    }
}

Form1.cs

private void button1_Click(object sender, EventArgs e)
{
    Adapter obj = new Adapter();
    obj.RequiredMethod();
}

参考文献

* 以下のプログラムが分かりやすい
http://blogs.wankuma.com/masaru/archive/2010/03/10/186994.aspx