デザインパターンの1つである「Adapterパターン」の基本的な使い方を解説します。
環境
- Visual Studio 2022
- .NET 6
Adapterパターンとは
互換性がないクラス同士を連携させるためのパターンです。
新たにAdapterクラスを用意することで、既存クラスに変更を加えずにインターフェースを変更することができます。
変更したくない古いクラスや、変更ができない外部のクラスを、自分のシステムに組み込みたい場合などに使用されます。
Adapterパターンの実装例
インターフェースを実装していないレガシーな既存クラスを、インターフェース実装済みのクラスと同じように使用したい場合のサンプルコードです。
namespace AdapterPattern
{
/// <summary>
/// ターゲットインターフェース
/// </summary>
public interface IService
{
void ShowMessage();
}
/// <summary>
/// IServiceインターフェースを実装する現在のクラス
/// </summary>
public class CurrentService : IService
{
public void ShowMessage()
{
Console.WriteLine("カレントサービスです");
}
}
/// <summary>
/// IServiceインターフェースを実装しないレガシーなクラス(Adapteeクラス)
/// 長年使われており変更したくないが、現在のクラスと同じように呼び出したい
/// </summary>
public class LegacyService
{
public void LegacyMethod()
{
// 複雑な処理
Console.WriteLine("レガシーサービスです");
}
}
/// <summary>
/// IServiceインターフェースを実装し、LegacyServiceの機能を利用するためのAdapterクラス
/// </summary>
public class LegacyServiceAdapter : IService
{
private readonly LegacyService _service;
public LegacyServiceAdapter()
{
_service = new LegacyService();
}
public void ShowMessage()
{
// ShowMessageメソッド内でレガシーサービスのメソッドを実行
_service.LegacyMethod();
}
}
/// <summary>
/// クライアント
/// </summary>
class Program
{
static void Main()
{
// 各サービスをインスタンス化
var services = new List<IService>
{
new CurrentService(),
new LegacyServiceAdapter()
};
// 各サービスのShowMessageメソッドを順次実行
foreach (var service in services)
{
service.ShowMessage();
}
}
}
}
レガシーサービスをターゲットインターフェースに適合させるために、新たにAdapterクラスを用意し、その中でレガシーサービスのメソッドを実行しています。
こうすることで、レガシーサービスを変更せずに現在のインターフェースに適合させることができます。
サンプルコードを実行すると、現在のサービスと同様にレガシーサービスのメソッドが実行されていることが確認できます。
デザインパターンのおすすめ教材
①サンプルコードはJavaですが、豊富なイラストや柔らかい文体で抵抗なくデザインパターンを学べます。
著:Eric Freeman, 著:Elisabeth Robso, 監修:佐藤 直生, 翻訳:木下 哲也
¥5,280 (2025/01/14 18:30時点 | Amazon調べ)
ポチップ
②C#を使って手を動かしながらデザインパターンを学ぶならこちらの教材がおすすめです。