アダプタデザインパターンの操作

デザインパターンは、ソフトウェア設計で繰り返し発生する問題や複雑さに対するソリューションです。デザインパターンは、作成、構造、または動作に分類されます。作成パターンは、クラスのインスタンスを作成するメカニズムを作成および管理するために使用されます。構造パターンは、エンティティ間の関係を実現するために使用されます。動作設計パターンは、オブジェクトのコラボレーションと責任の委任を扱います。

アダプタパターンは、互換性のない2つのインターフェイス間のブリッジとして機能する構造設計パターンです。 「アダプタ」という用語は、相互に互換性のない2つのインターフェイスが通信およびコラボレーションできるようにするオブジェクトを表すために使用されます。本質的に、アダプタパターンは、クラス(互換性のないインターフェイスを持つ)が連携して機能し、必要に応じてそれらのオブジェクトが通信できるようにします。

ターゲットと被適応者の両方のインターフェースを実装する特定のタイプのアダプターがあります。このようなタイプのアダプターは、双方向アダプターとして知られています。また、クラスアダプタとオブジェクトアダプタという2つの異なるタイプのアダプタがあります。前者は継承を使用しますが、後者は構成を使用してデザインの非互換性の問題を修正します。アプリケーションにあるタイプと互換性のないサードパーティのライブラリを使用する必要がある場合は、アダプタデザインパターンを使用できます。

以下は、アダプタパターンの一般的な実装に参加するタイプのリストです。

  • 目標
  • アダプタ
  • アダプター
  • クライアント

例を挙げてこれを理解しましょう。異なる言語を話し、理解する2人がコミュニケーションをとる必要があるとします。1人はフランス語で、もう1人はドイツ語です。したがって、これらの2人は、それぞれフランス語とドイツ語のみを話し、理解することができます。両方ではありません。通常、コミュニケーションを促進するには、これらの両方の言語を知っている誰か(通訳者)が必要です。したがって、この通信を容易にすることができる人がアダプタとして機能します。

このパターンを使用してアプリケーションの型を構造化するため、このパターンは構造カテゴリに分類されます。通常、このパターンは1つのインターフェイスを別のインターフェイスに変換できます。Gang of Fourは、アダプタパターンを「クラスのインターフェイスをクライアントが期待する別のインターフェイスに変換します。アダプタを使用すると、インターフェイスの互換性がないために他の方法では不可能だったクラスを連携させることができます」と定義しています。

それでは、いくつかのコードを掘り下げてみましょう。次の2つのクラスについて考えてみます。

public class TargetA

            {

                public void DisplayA()

                {

                    Console.WriteLine("TargetA");

                }

            }

            public class TargetB

            {

                public void DisplayB()

                {

                    Console.WriteLine("TargetB");

                }

            }

ご覧のとおり、2つのクラスには互換性がありません。共通のベースもありません。次のコードリストは、アダプタクラスがどのように見えるかを示しています。

public interface ITargetAdapter

            {

                void ProcessData();

            }

public class AdapterA : ITargetAdapter

            {

                 public TargetA targetA { get; set; }

                 public void Process()

                 {

                     targetA.DisplayA();

                 }

                 public AdapterA(TargetA obj)

                 {

                     targetA = obj;

                 }

            }

            public class AdapterB : ITargetAdapter

            {

                 public TargetB targetB { get; set; }

                 public void Process() { targetB.DisplayB(); }

                 public AdapterB(TargetB obj)

                 {

                     targetB = obj;

                 }

            }

両方のアダプタクラスには、これらのクラスが実装するITargetAdapterという名前の1つの共通インターフェイスがあることに注意してください。2つのアダプタクラスのそれぞれには、それぞれのターゲットクラスのオブジェクトへの参照を受け入れる引数コンストラクタがあります。ITargetAdapterインターフェースには、Process()メソッドの宣言が含まれています。このメソッドは、両方のアダプタクラスによって実装されます。これらのメソッドは、先に実装したターゲットクラスのDisplay()メソッドとそれぞれのdisplayメソッドを呼び出します。

次のコードリストは、これらのアダプタクラスを使用する方法を示しています。

class Program

    {

        static void Main(string[] args)

        {

            ITargetAdapter adapter = new AdapterA(new TargetA());

            adapter.Process();

            adapter = new AdapterB(new TargetB());

            adapter.Process();

            Console.Read();

        }

上記のコードスニペットでわかるように、それぞれのターゲットクラスのインスタンスをアダプタクラスのコンストラクタに渡す必要があります。

今後の投稿で、より多くのデザインパターンに関する議論をここで紹介します。アプリケーションでレガシーコードを呼び出す必要がある場合は、アダプタデザインパターンが適しています。この記事から、アダプターのデザインパターンについて詳しく知ることができます。