將一個類別的介面轉換成客戶希望的另外一個介面。Adapter模式使原本由於介面不相容而不能一起工作的類別可以一起工作。
我們需要一種方式,為一個功能正確但介面不合的物件建立一個新介面 -設計模式的解析與活用
在一個Shape
的類別內包含了許多不同的子類別Point
Line
Square
而因為客戶需求而多增加了一個Circle
的類別,很恰巧的有一個現成的CircleKing
類別可使用
內部展現功能都是我們所需,唯一問題點在於內部方法名稱等設計,與Shape
子類別不同
若要維持不更動CircleKing
類別的情況下,同時保持Shape
的多型設計
就必須使用轉接器(Adapter)
class Target
def request
'Target: The default target\'s behavior.'
end
end
class Adaptee
def specific_request
'.eetpadA eht fo roivaheb laicepS'
end
end
class Adapter < Target
def initialize(adaptee)
@adaptee = adaptee
end
def request
"Adapter: (TRANSLATED) #{@adaptee.specific_request.reverse!}"
end
end
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)
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
提供介面讓Adaptee
物件得以轉換
所以需要先產生Adapter
物件,才可以翻譯Adaptee
的內容(或實踐方法)
此外,Adapter
與Adaptee
不需要有繼承關係,就可以使用 轉接器(Adapter) 模式
文章不定期更新!
感謝大家 如有問題,再煩請大家指教!