記事内に広告が含まれています

【C#】Adapterパターンの使い方

C#

デザインパターンの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 (2024/04/11 00:46時点 | Amazon調べ)

②C#を使って手を動かしながらデザインパターンを学ぶならこちらの教材がおすすめです。

【Udemy】デザインパターン2:Adapter,Singleton,Observer【C#】

icon
C#
hiranote

コメント

タイトルとURLをコピーしました