Паттерн Адаптер преобразует интерфейс класса к другому интерфейсу, на который рассчитан клиент.
Адаптер обеспечивает совместную работу классов, невозможную в обычных условиях из-за несовместимости интерфейсов. Преобразует один интерфейс к другому.
Мы часто видим адаптеры в реальной жизни, адаптеры для телефонов, розеток, различных устройств. Устройств может быть десятки, а для них может подходить один адаптер, который, к примеру позволяет заряжать их.
Тоже самое и с паттерном Адаптер, бывает такие ситуации, когда интерфейс разный, а логика у них похожа, вот для таких случаев применяется паттерн Адаптер, он позволяет нам совместить два разных интерфейса.
Если вам понадобится использовать существующий класс с не подходящим интерфейсом используйте паттерн адаптер.
Адаптер приводит интерфейс к тому виду, на который рассчитан клиент.
Объем работы по реализации адаптера зависит от размера и сложности целевого интерфейса
Я набросал просто пример, для того, как можно применить паттерн Адаптер. Представьте у нас есть контактный зоопарк, в котором мы держали только уток, которые умеют летать и крякать, мы разработали под них интерфейсы, классы работы, и все бы ничего, но нам решили привести индюков, мы понимаем, что птицы разные, но схожи по свойствам, и утки и индюки умеют летать, но утки крякают, а индюки чавкают. В данном случаи мы могли полностью переработать логику программы переписать интерфейсы, взаимодействия с интерфейсом и это бы заняло уйму времени. Но мы воспользуемся паттерном Адаптер, который позволит нам совместить индюков с утками, но переопределит их свойства.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
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(); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Индюшка чавк-чавк Я могу летать на короткие дистанции Утка кря-кря Я летаю Адаптер Индюшки чавк-чавк Я могу летать на короткие дистанции |
Паттерн Адаптер очень схож с паттерном Декоратор, но суть их в том, что Адаптер изменяет интерфейс, а Декоратор не изменяет интерфейс, но добавляет новые возможности.