
Адаптер (Adapter) — структурный шаблон проектирования, предназначенный для организации использования функций объекта, недоступного для модификации, через специально созданный интерфейс.
Простейшая схема работы паттерна:
Сформулируем проблему: У нас есть программа, которая должна работать с учётными данными социальных сетей VK, Facebook и Twitter, программа должна получать имя учетной записи, возраст и количество друзей.
Проблема в том, что каждая социальная сеть использует отличный от других синтаксис, для получения этих данных…
Для начала, реализуем классы, для работы с данными соц. сетями.
Класс для работы с VK:
public class Vk : IVk
{
private readonly string _vkName;
private readonly int _vkAge;
private readonly int _vkNumberOfFriends;
public Vk(string vkName, int vkAge, int vkNumberOfFriends)
{
_vkName = vkName;
_vkAge = vkAge;
_vkNumberOfFriends = vkNumberOfFriends;
}
public string VkName
{
get { return _vkName; }
}
public int VkAge {
get { return _vkAge; }
}
public int VkNumberOfFriends {
get { return _vkNumberOfFriends; }
}
}
Аналогичные классы делаем для Facebook и Twitter.
Теперь реализуем интерфейс адаптера. Он будет иметь методы, для получения имени, возраста и количества друзей.
public interface IAdapter
{
string Name { get; }
int Age { get; }
int NumberOfFriends { get; }
}
Теперь нужно сделать классы адаптеры для каждой сети, реализующие интерфейс IAdapter. Для VK результат будет следующим:
class VkAdapter: IAdapter
{
private readonly IVk _vk;
public VkAdapter(IVk vk)
{
_vk = vk;
}
public string Name {
get { return _vk.VkName; }
}
public int Age {
get { return _vk.VkAge; }
}
public int NumberOfFriends {
get { return _vk.VkNumberOfFriends; }
}
}
Теперь реализуем саму программу (её класс), отвечающую за вывод информации о пользователях.
public static class UserProfile
{
public static void PrintUserInfo(IAdapter user)
{
Console.WriteLine("Имя пользователя: \t\t {0}", user.Name);
Console.WriteLine("Возраст: \t\t\t {0}", user.Age);
Console.WriteLine("Количество друзей: \t\t {0}", user.NumberOfFriends);
Console.WriteLine("--- --- --- --- --- ---");
}
}
Я использовал статический класс с методом PrintUserInfo, принимающий класс, реализующий интерфейс IAdapter. Сам метод выводит необходимую информацию в консоль.
Код для проверки работоспособности:
var vkUser = new Vk.Vk("Василий Пупкин", 22, 987);
var facebookUser = new Facebook.Facebook("Геннадий Петров", 28, 56);
var twitterUser = new Twitter.Twitter("Елизавета Короткевич", 18, 99);
UserProfile.PrintUserInfo(new VkAdapter(vkUser));
UserProfile.PrintUserInfo(new FacebookAdapter(facebookUser));
UserProfile.PrintUserInfo(new TwitterAdapter(twitterUser));
Результат работы:
Исходный код учебного проекта: https://github.com/flash2048/Patterns/tree/master/Adapter