概要:
アダプターパターンは、あるクラスのインターフェースを別のインターフェースに変換することで、互換性がないため一緒に動作できないクラスが一緒に動作できるようにします。
使用場面:
- 既存のクラスを使用したいが、そのインターフェースが要求に合っていない場合。
- 再利用可能なクラスを作成し、他の関連性のないまたは予測不可能なクラス(つまり、インターフェースが必ずしも互換性がない可能性のあるクラス)と協調して動作させたい場合。
- (オブジェクトアダプターの場合のみ)既存のサブクラスを使用したいが、すべてのサブクラスをサブクラス化してインターフェースを一致させるのは不可能な場合。オブジェクトアダプターはその親インターフェースを適応させることができます。
コード構造:
1. 目標インターフェース
/// <summary>
/// クライアントが期待する目標インターフェース
/// </summary>
class Target
{
public virtual void Request()
{
Console.WriteLine("通常のリクエスト");
}
}
2. 適応が必要なクラス
/// <summary>
/// 適応が必要なクラス
/// </summary>
class Adaptee
{
public void SpecificRequest()
{
Console.WriteLine("特殊なリクエスト");
}
}
3. アダプターの構築
/// <summary>
/// 内部でAdapteeオブジェクトをラップすることで、ソースインターフェースを目標インターフェースに変換する
/// </summary>
class Adapter : Target
{
private Adaptee adaptee = new Adaptee();
public override void Request()
{
// これにより、表面上はRequest()メソッドを呼び出すが、実際にはSpecificRequest()が呼び出される
adaptee.SpecificRequest();
}
}
4. 呼び出し例
/// <summary>
/// アダプターパターンのテスト
/// </summary>
static void TestAdapter()
{
Target target = new Adapter();
target.Request();
Console.Read();
}
まとめ:
アダプターパターンは、再構築が困難な場合に有効な解決策であり、実際の問題を解決することが最も重要です。.NETクラスライブラリのDataAdapterは、DataSetとデータソース間のアダプターとして機能し、データの取得と保存を行います。DataAdapterは、Fill(DataSetのデータをデータソースのデータに合わせて変更)とUpdate(データソースのデータをDataSetのデータに合わせて変更)を通じてこのアダプタを提供します。