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

## Adapterパターン
Adapterパターンです。

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

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

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

## クラス図

![image.png](https://qiita-image-store.s3.amazonaws.com/0/293729/9f75b6db-5b02-e683-aa49-96fabc43f3be.png)

## 実行イメージ [C#]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/293729/55499fb3-6ed7-fc80-83d9-8710d2e7cc94.png)

## コード [C#]

``` cs
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](https://qiita-image-store.s3.amazonaws.com/0/293729/098556bd-74b0-a2df-faae-b0ff6786cacd.png)

## コード [C++]
``` cpp
#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");
}
```