你是否曾經遇過辛辛苦苦開發了一個不錯的程式包,卻因為一點點的差異導致無法被重複應用。
這個差異可能是 5%、10%、20% 左右,但卻造成了整包東西無法被再次使用、整合的情境。
今天在專案中引用一個 A 服務,隔天被告知要更換成 B 服務,幾周後又要改成 C 服務,而來自 A B C 的服務本身或多或少都有差異,造成每一次的改變都必須更動到原本的程式邏輯才能完美契合。
但對於程式碼的維護來說卻是糟糕的處理方式,每一次的更正都必須要跑一次測試。
這就像過去有許許多多不同規格的電線插頭一樣,為了不同的插頭而去更換機械部件的插座,非常不符合效益。
今天要說到的 Adapter 正是後來出現的 "轉接頭",他實現了不同規格仍能對接的期望,避免需要更換插座或是更換插頭的狀況。
Adapter Pattern
中文常見名稱 建造者模式
屬於 Structural Design Pattern 一種常見的設計理念。
目的是幫助工程師在對接服務的時候,避免需要動到對街服務本身的邏輯,從而避免了可能因改動造成的問題。確保了程式本身的獨立與完整。
優點:
缺點:
Adapter Design Pattern 又分為兩種:
透過實作指定 Interface 的 Adapter 類,並放入想要轉換的類方式實現調配
圖片來源於 Adapter Design Pattern Wiki
透過多重繼承的方式進行調配,適用於 C++、Python,Java 因為不支援多重繼承,故需要改寫成繼承與實作並行的方式實現調配
圖片來源於 Adapter Design Pattern Wiki
範例中有 InitService1、InitService2 兩介面,與實作介面的實體 Service1Impl、Service2Impl
Kai 這邊建立一個將 Service1 轉為 Service2 的 Adapter 類別 AdapterService1ToService2,由於目標是轉成 Service2,故需實作 InitService2
除了實作介面的方法外,還包含將 Service1 放入的方法,在使用上就可以透過放入 Service1 的方式對接 Service2 的服務了
用一句話介紹 Adapter Pattern: 一個轉接頭概念的設計模式
Design Pattern