LoginSignup
20
16

More than 5 years have passed since last update.

Adapterパターン [C#][C++]

Last updated at Posted at 2018-11-12

Adapterパターン

Adapterパターンです。

ドイツ人と中国人と日本人は話す言語が違います。
これを1つにまとめて管理したい場合は、Adapterパターンが有用です。
Adapterとは適合するという意味で、Wrapperパターンとも呼ばれます。

利用シーンは、以下が考えられます。

利用シーン

  • 関連性のないクラス同士を既存のクラスを返すに関連づける場合
  • 既存のクラスをある新しいインタフェースを通じて再利用したい場合
  • 既存のクラス・インタフェースをアプリケーション固有なものにしたい場合

クラス図

image.png

実行イメージ [C#]

image.png

コード [C#]

using System;
using System.Collections.Generic;

namespace TEST
{
    interface IGreeting
    {
        void SayHello();
    }

    class German
    {
        public void SayHelloGerman()
        {
            Console.WriteLine("グーテンターク");
        }
    }

    class Chinese
    {
        public void SayHelloChinese()
        {
            Console.WriteLine("ニーハオ");
        }
    }

    class Japanese
    {
        public void SayHelloJapanese()
        {
            Console.WriteLine("こんにちは");
        }
    }

    class GermanAdapter : IGreeting
    {
        public void SayHello()
        {
            German german = new German();
            german.SayHelloGerman();
        }
    }

    class ChineseAdapter : IGreeting
    {
        public void SayHello()
        {
            Chinese chinese = new Chinese();
            chinese.SayHelloChinese();
        }
    }

    class JapaneseAdapter : IGreeting
    {
        public void SayHello()
        {
            Japanese japanese = new Japanese();
            japanese.SayHelloJapanese();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            IGreeting german = new GermanAdapter();
            IGreeting chinese = new ChineseAdapter();
            IGreeting japanese = new JapaneseAdapter();

            Console.WriteLine("[Pattern 1]");
            german.SayHello();
            chinese.SayHello();
            japanese.SayHello();

            Console.WriteLine("[Pattern 2]");
            List<IGreeting> list = new List<IGreeting>();
            list.Add(german);
            list.Add(chinese);
            list.Add(japanese);

            foreach (var item in list)
            {
                item.SayHello();
            }

            Console.ReadLine();
        }
    }
}

実行イメージ [C++]

image.png

コード [C++]

#include <iostream>
#include <vector>

class IGreeting
{
public:
    virtual void SayHello() = 0;
};

class German
{
public:
    void SayHelloGerman()
    {
        std::cout << "グーテンターク" << std::endl;
    }
};

class Chinese
{
public:
    void SayHelloChinese()
    {
        std::cout << "ニーハオ" << std::endl;
    }
};

class Japanese
{
public:
    void SayHelloJapanese()
    {
        std::cout << "こんにちは" << std::endl;
    }
};

class GermanAdapter : public IGreeting
{
public:
    void SayHello() override
    {
        German german;
        german.SayHelloGerman();
    }
};

class ChineseAdapter : public IGreeting
{
public:
    void SayHello() override
    {
        Chinese chinese;
        chinese.SayHelloChinese();
    }
};

class JapaneseAdapter : public IGreeting
{
public:
    void SayHello() override
    {
        Chinese chinese;
        chinese.SayHelloChinese();
    }
};

int main()
{
    IGreeting *german = new GermanAdapter();
    IGreeting *chinese = new ChineseAdapter();
    IGreeting *japanese = new JapaneseAdapter();

    std::cout << "[Pattern 1]" << std::endl;
    german->SayHello();
    chinese->SayHello();
    japanese->SayHello();

    delete german;
    delete chinese;
    delete japanese;

    std::cout << "[Pattern 2]" << std::endl;
    std::shared_ptr<IGreeting> German = std::make_shared<GermanAdapter>();
    std::shared_ptr<IGreeting> Chinese = std::make_shared<ChineseAdapter>();
    std::shared_ptr<IGreeting> Japanese = std::make_shared<JapaneseAdapter>();
    German->SayHello();
    Chinese->SayHello();
    Japanese->SayHello();

    std::cout << "[Pattern 3]" << std::endl;
    std::vector<std::shared_ptr<IGreeting>> list;
    list.emplace_back(German);
    list.emplace_back(Chinese);
    list.emplace_back(Japanese);

    for (auto item : list)
    {
        item->SayHello();
    }

    system("pause");
}
20
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
16