おーみんブログ

C#, ASP.NET Core, Unityが大好きです。

C#でAdapterパターンを体験してみた。

はじめに

GoFデザインパターンの1つであるAdapterパターンを体験してみました。

Adapterパターンとは

Adapterパターンとは既に提供されているクラスを特定の部分へ使いまわす際に良い感じに使えるように変換させるデザインパターンです。 既に提供されているクラスを使いたいけど、一部用途が合わなくて使えない~~という時に使うイメージです。

サンプルコード

以下は元々あったライフスタイルクラスへAdapterパターンを適用し、夏休み用のライフスタイルを作成するサンプルコードです。

public class Program
{
    static void Main(string[] args)
    {
        ISummerVacation summerVacation = new SummerVacationLifeStyle();
        Console.WriteLine("---- 夏休みの平日の過ごし方 ----");
        summerVacation.SummerVacationWeekday();
        Console.WriteLine("");
        Console.WriteLine("---- 夏休みの休日の過ごし方 ----");
        summerVacation.SummerVacationHoliday();
    }

    // 元々あったライフスタイルクラスを使いまわしたい
    public class LifeStyle
    {
        public void Weekday()
        {
            Console.WriteLine("早起きする。");
        }

        public void Holiday()
        {
            Console.WriteLine("いっぱい寝る。");
        }
    }

    // 夏休み用の過ごし方を表すインターフェースを用意します。
    public interface ISummerVacation
    {
        public void SummerVacationWeekday();
        public void SummerVacationHoliday();
    }

    // 夏休み用ライフスタイルクラスで元々あったクラスを利用 + 独自にカスタマイズします。
    // 今回は平日の過ごし方を夏休み用にカスタマイズしました。
    public class SummerVacationLifeStyle : ISummerVacation
    {
        private LifeStyle _lifeStyle;
        public SummerVacationLifeStyle()
        {
            _lifeStyle = new LifeStyle();
        }

        public void SummerVacationWeekday()
        {
            _lifeStyle.Weekday();
            Console.WriteLine("と思ったけど...夏休みなので二度寝をした。");
        }

        public void SummerVacationHoliday()
        {
            _lifeStyle.Holiday();
        }
    }
}
---- 夏休みの平日の過ごし方 ----
早起きする。
と思ったけど...夏休みなので二度寝をした。

---- 夏休みの休日の過ごし方 ----
いっぱい寝る。

継承パターンと委譲パターンがある

今回ご紹介させていただいたAdapterパターンですが、実は継承パターンと委譲パターンの2種類あります。 調べてみると継承パターンはあまり使わないという内容を結構目にしましたので今回のサンプルコードでは委譲パターンで実装しました。 継承パターンと委譲パターンについては以下のWikipediaの記事が参考になるかと思います。

ja.wikipedia.org

おわりに

Adapterパターン、とても便利ですね! もしこれを知らなかったら新たに夏休み用のライフスタイルクラスを作成して似た処理を書いてしまうという感じでしょうか。 結構利用できる場所が多そうなのでしっかり身につけていきたいと思います。