ОБРАЗЕЦ АДАПТЕРА В ОБЪЕКТНО-ОРИЕНТИРОВАННОМ ПРОГРАММИРОВАНИИ

Процесс разработки программирования аналогичен человеческому развитию, он идет от низкого к высокому. Объектно-ориентированное программирование стало довольно популярным. Пионеры программирования нашли общие проблемы в объектно-ориентированном программировании, а также нашли решения для их оптимального решения в большинстве случаев. В этой статье будет упоминаться шаблон проектирования, который обычно используется в объектно-ориентированном программировании; Шаблон адаптера.

ЧТО ТАКОЕ ШАБЛОН АДАПТЕРА?

Адаптер очень популярен в нашей повседневной жизни. Мы часто встречаем много типов адаптеров, таких как: адаптеры питания (преобразователь напряжения), адаптеры для портативных компьютеров (зарядное устройство для портативных компьютеров), адаптеры для карт памяти и т. Д. В основном это промежуточный мост, который помогает управлять двумя объектами вместе.

Что ж, когда мы говорим о шаблоне адаптера, мы говорим почти об одном и том же. Когда у вас есть объекты, но они не могут использоваться с вашим встроенным интерфейсом, потому что он не подходит, наиболее подходящим решением будет создание нового интерфейса для объекта с промежуточным слоем интерфейса, который называется «Адаптер». Этот класс отвечает только за переключение интерфейса, методы, которые этот класс должен будет использовать, являются методами объекта, который он адаптирует.

СОЧИНЕНИЕ

  • Клиент: это класс, который будет использовать ваш объект (объект, интерфейс которого вы хотите преобразовать).
  • Адаптированный: это класс, который класс Client хочет использовать, но у которого есть несоответствие интерфейса.
  • Адаптер: это промежуточное звено, переключающее интерфейс для соединения адаптируемого и клиента.

КЛАССИФИКАЦИЯ ОБРАЗЦОВ

В объектно-ориентированном программировании есть две важные концепции, которые параллельны друг другу;

  • Состав: класс (A) станет компонентом другого класса (B). Класс (A) не наследует класс (B), но имеет все возможности от класса (B).
  • Наследование: класс наследуется от базового класса и наследует все возможности от базового класса.

Используя эти две концепции, у нас есть два способа установить класс адаптера: Адаптер объекта и Адаптер класса.

ОБЪЕКТНЫЙ АДАПТЕР

Адаптер объектов полезен, если вы хотите использовать класс, который не имеет точных методов, которые вам нужны, и что вы не можете изменить исходный класс. Адаптер может принимать методы, к которым вы можете получить доступ в исходном классе, и адаптировать их к нужным вам методам. Давайте посмотрим, что это означает, на следующем примере:

У нас есть класс Adaptee со следующей структурой:

‹? Php

class SimpleBank {

личное $ имя;

личный баланс в долларах;

функция __construct ($ name_in, $ balance_in) {

$ this- ›name = $ name_in;

$ this- ›balance = $ balance_in;

}

function getName () {

вернуть $ this- ›name;

}

function getBalance () {

вернуть $ this- ›баланс;

}

}

?>

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

‹? Php

class BankAdapter {

частный банк $;

функция __construct (SimpleBank $ bank_in) {

$ this- ›bank = $ bank_in;

}

function getNameAndBalance () {

return $ this- ›bank-› getName (). ‘иметь баланс:‘. $ this- ›book-› getBalance ();

}

}

?>

Теперь вы можете получить название банковского счета и остаток в банке с помощью метода из класса BankAdapter:

‹? Php

$ bank = новый SimpleBank («Название банковского счета», «10,000 $»);

$ bankAdapter = новый BankAdapter ($ bank);

echo «НАИМЕНОВАНИЕ И СЧЕТ БАНКОВСКОГО СЧЕТА»;

echo $ bankAdapter- ›getNameAndBalance ();

?>

И вывод будет:

НАИМЕНОВАНИЕ И СЧЕТ БАНКОВСКОГО СЧЕТА:

Баланс на имя банковского счета: 10,000 $

АДАПТЕР КЛАССА

Шаблон класса, который позволяет использовать интерфейс существующего класса для другого интерфейса. Он часто используется для того, чтобы существующие классы работали с другими без изменения их исходного кода.

Еще одно преимущество шаблона класса состоит в том, что он позволяет нам отделить наш клиентский код от адаптируемого.

В нашем примере мы будем работать с сохраненным классом информационных счетов. У нас есть простой класс:

‹? Php

class InformationManager {

общедоступная функция saveInformation ($ type = ”, $ data) {

switch ($ type) {

case «электронная почта»:

$ информация = новый EmailService ();

$ information- ›getTitle ($ this -› _ data [‘title’]);

$ information- ›getMessage ($ this -› _ data [‘message’]);

$ information- ›getEmail ($ this -› _ data [’email’]);

$ information- ›saveEmail ();

ломать;

case «facebook»:

$ information = new FacebookService ($ data);

$ information- ›getFirstName ($ this -› _ data [‘first_name’]);

$ information- ›getLastName ($ this -› _ data [‘last_name’]);

$ information- ›getEmail ($ this -› _ data [’email’]);

$ information- ›saveFacebook ();

ломать;

дефолт:

ломать;

}

}

}

?>

Мы можем перечислить проблемы с классом InformationManager, а именно:

  • Класс слишком много знает о реализации каждого типа информации.
  • Если изменяется какой-либо информационный класс, мы должны изменить код нашего класса.

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

Мы можем начать с создания класса InformationInterface:

‹? Php

interface InformationInterface {

общедоступная функция setData ($ data);

публичная функция saveInformation ();

}

?>

После этого мы создадим два класса адаптера и в каждом из них будет реализован InformationInterface:

‹? Php

класс EmailAdapter реализует InformationInterface

{

защищенный $ _data;

общедоступная функция setData ($ data) {

$ this - ›_ data = $ data;

}

публичная функция saveInformation ()

{

$ emailClient = новый EmailService ();

$ emailClient- ›getTitle ($ this -› _ data [‘title’]);

$ emailClient- ›getMessage ($ this -› _ data [‘message’]);

$ emailClient- ›getEmail ($ this -› _ data [’email’]);

$ emailClient- ›saveEmail ();

}

}

класс FacebookAdapter реализует InformationInterface

{

защищенный $ _data;

общедоступная функция setData ($ data) {

$ this - ›_ data = $ data;

}

публичная функция saveInformation ()

{

$ facebookClient = новый FacebookService ();

$ facebookClient- ›getFirstName ($ this -› _ data [‘first_name’]);

$ facebookClient- ›getLastName ($ this -› _ data [‘last_name’]);

$ facebookClient- ›getEmail ($ this -› _ data [’email’]);

$ facebookClient- ›saveFacebook ();

}

}

?>

На основе приведенного выше кода теперь мы можем переписать наш класс InformationManager следующим образом:

‹? Php

class InformationManager {

общедоступная функция saveInformation ($ type = ”, $ data)

{

switch ($ type) {

case «электронная почта»:

$ информация = новый EmailAdapter ();

ломать;

case «facebook»:

$ информация = новый FacebookAdapter ();

ломать;

дефолт:

вернуть ложь;

ломать;

}

$ information- ›setData ($ data);

$ information- ›saveInformation ();

}

}

?>

Если информационные службы реализуют InformationInterface, информационному менеджеру не нужно беспокоиться о специфике каждой реализации.

РЕЗЮМЕ

Шаблон адаптера чрезвычайно полезен в сочетании с принципами проектирования SOLID и помогает разработчикам писать более чистый и удобный в сопровождении код.

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

Не забудьте подписаться на нашу ежемесячную новостную рассылку, чтобы получать последние новости в мире программного обеспечения!

Первоначально опубликовано на https://apiumhub.com/tech-blog-barcelona/.