iT邦幫忙

2023 iThome 鐵人賽

DAY 1
0
自我挑戰組

掘地土撥鼠的設計歷險記系列 第 11

Adapter Pattern - 配接器模式

  • 分享至 

  • xImage
  •  

Introduction

Adapter Pattern是一種將一個類別的介面轉換成使用端希望使用的介面的一種做法,讓原本因為介面不同的多個物件從不能互動轉變為可以互動。

類別配接器模式可分為兩種:

  • 物件配接器
  • 類別配接器

兩者之間的不同在於,類別配接器類別之間的耦合性較高,並要求開發者需要對於整體專案內部架構有一定的理解,因此其使用的機會並不高。因此本篇文章會以物件配接器來講說。

物件配接器中的角色有

  • 目標 (Target): 定義使用端需要的介面,在這裡不會強制要求以介面實作方式實現,也可以是以繼承類別的方式來實現。
  • 配接器 (Adapter): 是個轉換器,負責 Adaptee 與想要的物件進行切換,是此模式中的核心。
  • 配接者 (Adaptee): 被配接的物件

使用場景

  • 當開發者希望使用某個類別,但他的介面與開發所在的code環境並不相容,或是使用兩個不兼容的系統 類別與介面時即可使用此模式。
  • 當開發者要建立一個可以重複使用的物件,但會與其他關係性較不高的物件互動時即可以用此模式。

雛形演練

UML

https://ithelp.ithome.com.tw/upload/images/20230922/20115082DtMxxRH6Q7.jpg

ObjectTarget

package objects

type ObjectTarget interface {
   Execute()
}

ObjectAdapter

package objects

type ObjectAdapter struct {
   Adaptee ObjectAdaptee
}

func (p *ObjectAdapter) Execute() {
   p.Adaptee.SpecifiExecute()
}

Adaptee

package objects

import "fmt"

type ObjectAdaptee struct {
}

func (b *ObjectAdaptee) SpecifiExecute() {
   fmt.Println("Executing: SpecificExecute")
}

main

package main

import objects "adapter/Objects"

func main() {
   adapter := objects.ObjectAdapter{}
   adapter.Execute()
}

優缺點比較

優點:

  • 介面轉換: Adapter模式允許您將一個現有的類別的介面轉換成另一個介面,這樣客戶端程式碼就可以與新介面互動,而不需要修改現有程式碼。這有助於保持程式碼的相容性。
  • 重複使用現有程式碼: 您可以重複使用現有的類別,而不需修改其程式碼,只需要建立一個適配器類別。這有助於節省時間和資源。
  • 解耦程式碼: Adapter模式有助於解耦客戶端程式碼和被適配的類別之間的關係。這表示您可以分別修改客戶端程式碼或被適配的類別,而不會影響其他部分。

缺點:

  • 過多的適配器: 如果您需要適配多個不同的類別,可能會導致大量的適配器類別,這可能會讓程式碼變得複雜且難以維護。
  • 效能開銷: 在某些情況下,使用適配器模式可能會引入一些效能開銷,因為需要額外的中間層來進行介面轉換。

Conclusion

在Adapter Pattern(適配器模式)中,我們探討了如何將一個類別的介面轉換成客戶端所期待的介面,以實現不同類別的互動。我們使用了物件配接器來演示這個模式,其中包括Target、Adapter、和 Adaptee 這三個主要角色。

優點方面,Adapter Pattern提供了介面轉換的能力,這有助於保持程式碼的相容性,重複使用現有程式碼,並解耦客戶端程式碼和被適配的類別,這對於維護和擴展程式碼非常有幫助。

然而,Adapter Pattern也有一些缺點。當需要適配多個不同的類別時,可能會產生大量的適配器類別,使程式碼變得複雜。此外,有時使用適配器模式可能會引入一些效能開銷,因為需要額外的中間層進行介面轉換。

總之,Adapter Pattern是一個有用的設計模式,特別適用於需要介面轉換的情況。在使用時,開發者應謹慎考慮其優缺點,以確保適當地應用於程式碼中,以提高程式碼的靈活性和可維護性。


上一篇
[補] Object Pool 實際應用
系列文
掘地土撥鼠的設計歷險記11
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言