Adapterパターン
Adapterパターンです。
ドイツ人と中国人と日本人は話す言語が違います。
これを1つにまとめて管理したい場合は、Adapterパターンが有用です。
Adapterとは適合するという意味で、Wrapperパターンとも呼ばれます。
利用シーンは、以下が考えられます。
利用シーン
- 関連性のないクラス同士を既存のクラスを返すに関連づける場合
- 既存のクラスをある新しいインタフェースを通じて再利用したい場合
- 既存のクラス・インタフェースをアプリケーション固有なものにしたい場合
クラス図
実行イメージ [C#]
コード [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++]
コード [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");
}