iT邦幫忙

2022 iThome 鐵人賽

DAY 15
0
自我挑戰組

Ruby OOP to Oops !n 30系列 第 15

IT 邦鐵人賽 Day 15 - Adapter

  • 分享至 

  • xImage
  •  

轉接器(Adapter)

目的:

將一個類別的介面轉換成客戶希望的另外一個介面。Adapter模式使原本由於介面不相容而不能一起工作的類別可以一起工作。

我們需要一種方式,為一個功能正確但介面不合的物件建立一個新介面 -設計模式的解析與活用

使用時機:

在一個Shape的類別內包含了許多不同的子類別Point Line Square
而因為客戶需求而多增加了一個Circle的類別,很恰巧的有一個現成的CircleKing類別可使用
內部展現功能都是我們所需,唯一問題點在於內部方法名稱等設計,與Shape子類別不同
若要維持不更動CircleKing類別的情況下,同時保持Shape的多型設計
就必須使用轉接器(Adapter)

範例架構:

https://ithelp.ithome.com.tw/upload/images/20220930/20151094SQZpIE79mG.png

架構:

https://ithelp.ithome.com.tw/upload/images/20220930/20151094xsKC2oW473.png

程式碼範例:

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的內容(或實踐方法)
此外,AdapterAdaptee不需要有繼承關係,就可以使用 轉接器(Adapter) 模式

優點

  1. SRP,因為轉換過程不用寫在需要轉換的類別內,而是抽出來設定一個 轉接器(Adapter) 介面
  2. Open/Closed Principle,,只需新增 轉接器(Adapter) ,不用修改原類別

文章不定期更新!

感謝大家 如有問題,再煩請大家指教!


上一篇
IT 邦鐵人賽 Day 14 - Singleton
下一篇
IT 邦鐵人賽 Day 16 - Bridge
系列文
Ruby OOP to Oops !n 3020
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
Jean_HSU
iT邦新手 5 級 ‧ 2022-10-03 22:02:30

喳喳

我要留言

立即登入留言