Autumn SALE
Adapter

Adapter w języku Ruby

Adapter to strukturalny wzorzec projektowy pozwalający na współpracę niekompatybilnych obiektów ze sobą.

Adapter pełni rolę opakowania dwóch obiektów. Przechwytuje wywołania jednego z obiektów i przekształca je na format i interfejs zrozumiały dla drugiego obiektu.

Złożoność:

Popularność:

Przykłady użycia: Wzorzec Adapter jest dość powszechny w kodzie Ruby. Często stosuje się go w systemach bazujących na przestarzałym kodzie, gdzie pozwala na współdziałanie takiego kodu z nowoczesnymi klasami.

Identyfikacja: Adapter można rozpoznać po konstruktorze przyjmującym instancję innego typu abstrakcji/interfejsu. Gdy adapter otrzymuje wywołanie kierowane do którejś z jego metod, tłumaczy parametry wywołania do stosownego formatu i przekazuje je do jednej lub wielu metod opakowanego obiektu.

Przykład koncepcyjny

Poniższy przykład ilustruje strukturę wzorca Adapter ze szczególnym naciskiem na następujące kwestie:

  • Z jakich składa się klas?
  • Jakie role pełnią te klasy?
  • W jaki sposób elementy wzorca są ze sobą powiązane?

main.rb: Przykład koncepcyjny

# The Target defines the domain-specific interface used by the client code. class Target # @return [String] def request 'Target: The default target\'s behavior.' end end # The Adaptee contains some useful behavior, but its interface is incompatible # with the existing client code. The Adaptee needs some adaptation before the # client code can use it. class Adaptee # @return [String] def specific_request '.eetpadA eht fo roivaheb laicepS' end end # The Adapter makes the Adaptee's interface compatible with the Target's # interface. class Adapter < Target # @param [Adaptee] adaptee def initialize(adaptee) @adaptee = adaptee end def request "Adapter: (TRANSLATED) #{@adaptee.specific_request.reverse!}" end end # The client code supports all classes that follow the Target interface. 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: Wynik działania

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. 

Adapter w innych językach

Adapter w języku C# Adapter w języku C++ Adapter w języku Go Adapter w języku Java Adapter w języku PHP Adapter w języku Python Adapter w języku Rust Adapter w języku Swift Adapter w języku TypeScript