Паттерн Адаптер преобразует интерфейс класса к другому интерфейсу, на который рассчитан клиент.
Адаптер обеспечивает совместную работу классов, невозможную в обычных условиях из-за несовместимости интерфейсов. Преобразует один интерфейс к другому.
Мы часто видим адаптеры в реальной жизни, адаптеры для телефонов, розеток, различных устройств. Устройств может быть десятки, а для них может подходить один адаптер, который, к примеру позволяет заряжать их.
Тоже самое и с паттерном Адаптер, бывает такие ситуации, когда интерфейс разный, а логика у них похожа, вот для таких случаев применяется паттерн Адаптер, он позволяет нам совместить два разных интерфейса.
Если вам понадобится использовать существующий класс с не подходящим интерфейсом используйте паттерн адаптер.
Адаптер приводит интерфейс к тому виду, на который рассчитан клиент.
Объем работы по реализации адаптера зависит от размера и сложности целевого интерфейса
Я набросал просто пример, для того, как можно применить паттерн Адаптер. Представьте у нас есть контактный зоопарк, в котором мы держали только уток, которые умеют летать и крякать, мы разработали под них интерфейсы, классы работы, и все бы ничего, но нам решили привести индюков, мы понимаем, что птицы разные, но схожи по свойствам, и утки и индюки умеют летать, но утки крякают, а индюки чавкают. В данном случаи мы могли полностью переработать логику программы переписать интерфейсы, взаимодействия с интерфейсом и это бы заняло уйму времени. Но мы воспользуемся паттерном Адаптер, который позволит нам совместить индюков с утками, но переопределит их свойства.
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();
}
}
}
Индюшка
чавк-чавк
Я могу летать на короткие дистанции
Утка
кря-кря
Я летаю
Адаптер Индюшки
чавк-чавк
Я могу летать на короткие дистанции

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