Adapter

目的

Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn’t otherwise because of incompatible interfaces.
(將類別的界面轉換成外界所預期的另一種介面,讓原先囿於介面不相容問題而無法協力合作的類別能夠兜在一起用。[1])

Adapter 是一個結構模式,它能夠轉換既有的介面成為我們預期的介面,也被叫做 Wrapper。 Adapter 應用十分廣泛,只要曾經嘗試使用 Third-party Library 或者以前寫過的 codes,就能夠應用 Adapter 去符合現在的需求。

Adapter 實作方法有二:

  • Class Adapter:利用多重繼承實作
  • Object Adapter:利用物件複合(object composition)實作

Adapter 的 UML Class Diagram:

主要優缺點:

  • Class Adapter:可以 override Adaptee 原有的行為,但只能轉換單一的 Adaptee,無法動態更換。
  • Object Adapter:可動態轉換不同的 Adaptee,但無法 override Adaptee 原有的行為。

基本上 Object Adapter 比較容易實作與實用,且更具彈性。此外,Object Adapter 的 performance 也比較好。

範例程式:

範例程式與 Class Diagram 的對應關係:

  • Client <==> Canvas
  • Target <==> Rectangle
  • Adapter <==> RectangleAdapter, RectangleClassAdapter, and RectangleObjectAdapter
  • Adaptee <==> LegacyRectangle

從範例程式中,可以發現 Objective-C 的實作更具有彈性,利用 delegation 實作出更富有彈性的 pluggable Adapter。對於 Canvas 而言,只要遵守 DrawableObjectDelegate protocol 的 objects 皆可以被放到 Canvas 之中被畫出來,反觀 C++ ,如果需要達到此彈性,就必須定義出更抽象的 class,讓所有可以放進 Canvas 的 objects 都繼承此抽象 class。

[1] “物件導向設計模式”, Gamma, Johnson, Helm, Vlissides 著, 葉秉哲譯
[2] “我的Design Pattern之旅[6] : Adapter Pattern (OO) (Design Pattern) (C/C++) (.NET) (C#) (C++/CLI) (VB)”, 真 OO无双, http://www.cnblogs.com/oomusou/archive/2007/07/16/820023.html


Originally published at kf99916cs.blogspot.com on September 14, 2017.