Паттерны проектирования: Адаптер (Adapter)

Адаптер (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));

Результат работы:

Исходный код учебного проекта: http://1drv.ms/1Hk2TRK

Комментарии (1) -

Какую программу вы используете для рисования UML диаграмм?

Добавить комментарий