CoffeeScript 適配器模式

2022-06-29 17:14 更新

適配器模式

問(wèn)題

想象你去國(guó)外旅行,一旦你意識(shí)到你的電源線插座與酒店房間墻上的插座不兼容時(shí),幸運(yùn)的是你記得帶你的電源適配器。它將一邊連接你的電源線插座另一邊連接墻壁插座,允許它們之間進(jìn)行通信。

同樣的情況也可能會(huì)出現(xiàn)在代碼中,當(dāng)兩個(gè) ( 或更多 ) 實(shí)例 ( 類(lèi)、模塊等 ) 想跟對(duì)方通信,但其通信協(xié)議 ( 例如,他們所使用的語(yǔ)言交流 ) 不同。在這種情況下,Adapter模式更方便。它會(huì)充當(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)你要組織兩個(gè)具有不同接口的對(duì)象之間的交互時(shí),適配器是有用的。它可以當(dāng)你使用第三方庫(kù)或者使用遺留代碼時(shí)使用。在任何情況下小心使用適配器:它可以是有用的,但它也可以導(dǎo)致設(shè)計(jì)錯(cuò)誤。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)