Шаблон адаптера на практике от swift

Шаблон адаптера — это один из шаблонов структурного проектирования, который позволяет нам адаптировать интерфейс компонента к интерфейсу, ожидаемому клиентом, без изменения компонента.

Например, если вы купили iPhone в США и отправились в Великобританию, вам понадобится адаптер для зарядки вашего iPhone. В этой ситуации Клиентом является iPhone.

Клиент: объект, использующий адаптер.

NewProtocol: поскольку Swift не поддерживает множественное наследование, мы используем протокол.

Адаптер: соответствует новому протоколу и переходит к устаревшему объекту.

Adaptee (устаревшие объекты): этот код нельзя изменить, как в сторонних библиотеках.

Хватит говорить о теоретическом определении 🙁 давайте погрузимся в пару реальных примеров.

  • Мы хотим использовать несколько реализаций аутентификации в таких приложениях, как Google, Facebook или нашу собственную аутентификацию. Хороший выбор для использования шаблона адаптера в этой ситуации, почему? Потому что, если мы хотим использовать аутентификацию Google и Facebook в приложении и разделить реализацию каждого из них на отдельные адаптеры, и у нас есть только один протокол, все адаптеры соответствуют этому протоколу, в этой ситуации мы отделили наш клиент от устаревшего кода, что означает мы можем тестировать нашу бизнес-логику изолированно и свободно добавлять или удалять любые аутентификации, не нарушая наш Кодекс.
  • Мы хотим, чтобы наше приложение поддерживало кэширование с использованием, например, Core data или Realm, в этой ситуации хорошим выбором будет использование адаптера. Почему? предположим, что вы использовали Realm без использования адаптера, и после этого мы решили использовать данные ядра вместо того, что произойдет в этой ситуации, вы должны изменить весь код приложения не практикуемым способом. что Если мы использовали адаптер, мы отделили реализацию области от клиента. Вы можете удалить Realm или добавить реализацию основных данных, не нарушая устаревший код или тесты.

Адаптер имеет множество применений и мощный шаблон для разделения кода.

Пример аутентификации

В этом примере я реализовал вход с помощью Google, если вы хотите узнать больше о googleSignIn. Теперь вы видите, что это чистый код, но loginViewController тесно связан со сторонней библиотекой Google SignIn. Предположим, вы добавили новую зависимость, такую ​​как Facebook SignIn или Login с Apple, вы увеличите зависимости в LoginViewController, в этой ситуации трудно протестировать ваш код, потому что тесно связаны, и если вы добавите или удалите какие-либо зависимости, это займет время😩😩😩.

Давайте реализуем шаблон адаптера для этой задачи 🥳🥳

1- Создайте протокол абстракции «Аутентификация» и добавьте один метод signIn. На этом этапе мы можем протестировать поведение метода signIn независимо от какой-либо сторонней библиотеки.

2- Создайте модель «Пользователь». Я выбрал те свойства, которые вы можете добавить, что хотите.🤗

3- Создайте новый класс «GoogleSignInAuthenticatorAdapter» и подтвердите аутентификацию, чтобы иметь возможность реализовать метод SigIn, который мы изолировали реализацию GoogleSignIn (устаревший код) от «LoginViewController», возьмите на себя эту ответственность перед адаптером.

4- Создайте новое свойство «authService», типизированное как протокол аутентификации, и инициализируйте «GoogleSignInAuthenticatorAdapter» в «viewDidLoad», а затем объявите кнопку «SignInWithGoogleBtn», чтобы иметь возможность реализовать «signIn».

Теперь LoginViewController отделен от Google SignIn, и у нас есть свобода изменять google signIn с любой зависимостью, не нарушая существующий код😊.

Если вы хотите увидеть исходный код 

https://github.com/amralkhayat/AdpaterPatternInPractice