Паттерн Адаптер примеры на C#

Паттерн Адаптер преобразует интерфейс класса к другому интерфейсу, на который рассчитан клиент.

Адаптер обеспечивает совместную работу классов, невозможную в обычных условиях из-за несовместимости интерфейсов. Преобразует один интерфейс к другому.

Мы часто видим адаптеры в реальной жизни, адаптеры для телефонов, розеток, различных устройств. Устройств может быть десятки, а для них может подходить один адаптер, который, к примеру позволяет заряжать их.

Тоже самое и с паттерном Адаптер, бывает такие ситуации, когда интерфейс разный, а логика у них похожа, вот для таких случаев применяется паттерн Адаптер, он позволяет нам совместить два разных интерфейса.

Если вам понадобится использовать существующий класс с не подходящим интерфейсом используйте паттерн адаптер.

Адаптер приводит интерфейс к тому виду, на который рассчитан клиент.

Объем работы по реализации адаптера зависит от размера и сложности целевого интерфейса

Я набросал просто пример, для того, как можно применить паттерн Адаптер. Представьте у нас есть контактный зоопарк, в котором мы держали только уток, которые умеют летать и крякать, мы разработали под них интерфейсы, классы работы, и все бы ничего, но нам решили привести индюков, мы понимаем, что птицы разные, но схожи по свойствам, и утки и индюки умеют летать, но утки крякают, а индюки чавкают. В данном случаи мы могли полностью переработать логику программы переписать интерфейсы, взаимодействия с интерфейсом и это бы заняло уйму времени. Но мы воспользуемся паттерном Адаптер, который позволит нам совместить индюков с утками, но переопределит их свойства.

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Паттерн_Адаптер
{
    public interface Duck
    {
        void Quack();
        void Fly();
    }

    public class MallardDuck : Duck
    {
        public void Fly()
        {
            Console.WriteLine("Я летаю");
        }

        public void Quack()
        {
            Console.WriteLine("кря-кря");
        }
    }

    public interface Turkey //Индюшка
    {
        void Gobble();
        void Fly();
    }

    public class WildTurkey : Turkey
    {
        public void Gobble()
        {
            Console.WriteLine("чавк-чавк");
        }
        public void Fly()
        {
            Console.WriteLine("Я могу летать на короткие дистанции");
        }
    }

    public class TurkeyAdapter : Duck
    {
        Turkey turkey;
        public TurkeyAdapter(Turkey turkey)
        {
            this.turkey = turkey;
        }
        public void Fly()
        {
            turkey.Fly();
        }
        
        //Адаптер должен реализовать все методы интерфейса, сдесь мы сделали простое преобразование
        public void Quack()
        {
            turkey.Gobble();
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            MallardDuck duck = new MallardDuck();
            WildTurkey turkey = new WildTurkey();
            Duck turkeyAdapter = new TurkeyAdapter(turkey);

            Console.WriteLine("Индюшка");
            turkey.Gobble();
            turkey.Fly();

            
            Console.WriteLine("\nУтка");
            ZooDuck(duck);

            Console.WriteLine("\nАдаптер Индюшки");
            ZooDuck(turkeyAdapter);

            Console.ReadKey();

        }

       static void ZooDuck(Duck duck)
        {
            duck.Quack();
            duck.Fly();
        }
    }
}

 

Индюшка
чавк-чавк
Я могу летать на короткие дистанции

Утка
кря-кря
Я летаю

Адаптер Индюшки
чавк-чавк
Я могу летать на короткие дистанции

Паттерн Адаптер очень схож с паттерном Декоратор, но суть их в том, что Адаптер изменяет интерфейс, а Декоратор не изменяет интерфейс, но добавляет новые возможности.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.