Глянь мой новый курс по Git! Привет! Глянь мой новый курс по Git! Привет! Глянь мой новый курс по Git на GitByBit.com! Привет! Хочешь круто подтянуть Git? Глянь мой новый курс на GitByBit.com!
Адаптер

Адаптер на Ruby

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

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

Сложность:

Популярность:

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

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

Концептуальный пример

Этот пример показывает структуру паттерна Адаптер, а именно — из каких классов он состоит, какие роли эти классы выполняют и как они взаимодействуют друг с другом.

main.rb: Пример структуры паттерна

# Целевой класс объявляет интерфейс, с которым может работать клиентский код.
class Target
  # @return [String]
  def request
    'Target: The default target\'s behavior.'
  end
end

# Адаптируемый класс содержит некоторое полезное поведение, но его интерфейс
# несовместим с существующим клиентским кодом. Адаптируемый класс нуждается в
# некоторой доработке, прежде чем клиентский код сможет его использовать.
class Adaptee
  # @return [String]
  def specific_request
    '.eetpadA eht fo roivaheb laicepS'
  end
end

# Адаптер делает интерфейс Адаптируемого класса совместимым с целевым
# интерфейсом.
class Adapter < Target
  # @param [Adaptee] adaptee
  def initialize(adaptee)
    @adaptee = adaptee
  end

  def request
    "Adapter: (TRANSLATED) #{@adaptee.specific_request.reverse!}"
  end
end

# Клиентский код поддерживает все классы, использующие интерфейс Target.
#
# @param [Target] target
def client_code(target)
  print target.request
end

puts 'Client: I can work just fine with the Target objects:'
target = Target.new
client_code(target)
puts "\n\n"

adaptee = Adaptee.new
puts 'Client: The Adaptee class has a weird interface. See, I don\'t understand it:'
puts "Adaptee: #{adaptee.specific_request}"
puts "\n"

puts 'Client: But I can work with it via the Adapter:'
adapter = Adapter.new(adaptee)
client_code(adapter)

output.txt: Результат выполнения

Client: I can work just fine with the Target objects:
Target: The default target's behavior.

Client: The Adaptee class has a weird interface. See, I don't understand it:
Adaptee: .eetpadA eht fo roivaheb laicepS

Client: But I can work with it via the Adapter:
Adapter: (TRANSLATED) Special behavior of the Adaptee.

Адаптер на других языках программирования

Адаптер на C# Адаптер на C++ Адаптер на Go Адаптер на Java Адаптер на PHP Адаптер на Python Адаптер на Rust Адаптер на Swift Адаптер на TypeScript