想象你去國外旅行,一旦你意識到你的電源線插座與酒店房間墻上的插座不兼容時,幸運的是你記得帶你的電源適配器。它將一邊連接你的電源線插座另一邊連接墻壁插座,允許它們之間進(jìn)行通信。
同樣的情況也可能會出現(xiàn)在代碼中,當(dāng)兩個 ( 或更多 ) 實例 ( 類、模塊等 ) 想跟對方通信,但其通信協(xié)議 ( 例如,他們所使用的語言交流 ) 不同。在這種情況下,Adapter 模式更方便。它會充當(dāng)翻譯,從一邊到另一邊。
# a fragment of 3-rd party grid component
class AwesomeGrid
constructor: (@datasource)->
@sort_order = 'ASC'
@sorter = new NullSorter # in this place we use NullObject pattern (another useful pattern)
setCustomSorter: (@customSorter) ->
@sorter = customSorter
sort: () ->
@datasource = @sorter.sort @datasource, @sort_order
# don't forget to change sort order
class NullSorter
sort: (data, order) -> # do nothing; it is just a stub
class RandomSorter
sort: (data)->
for i in [data.length-1..1] #let's shuffle the data a bit
j = Math.floor Math.random() * (i + 1)
[data[i], data[j]] = [data[j], data[i]]
return data
class RandomSorterAdapter
constructor: (@sorter) ->
sort: (data, order) ->
@sorter.sort data
agrid = new AwesomeGrid ['a','b','c','d','e','f']
agrid.setCustomSorter new RandomSorterAdapter(new RandomSorter)
agrid.sort() # sort data with custom sorter through adapter
當(dāng)你要組織兩個具有不同接口的對象之間的交互時,適配器是有用的。它可以當(dāng)你使用第三方庫或者使用遺留代碼時使用。在任何情況下小心使用適配器:它可以是有用的,但它也可以導(dǎo)致設(shè)計錯誤。