
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.