[Swift设计模式] 适配器

433 阅读3分钟
更多内容,欢迎关注公众号:Swift花园
喜欢文章?不如来点赞关注吧

将一个不兼容的对象转换成目标接口或者类,这是适配器模式的作用。

下面这件东西是适配器模式在现实世界中最贴切的表达。😜

USB-C to USB Adapter​www.apple.com图标

适配器是一种结构化的设计模式,使得各种互不兼容的接口可以协同工作。换言之,它对一个对象的接口做转换,以对接另一个不同对象的接口。

因为适配器能够做变换,所以它有时候也被称为“包装器”:把一个对象包裹起来,然后提供一个新的接口。 😂

 

实现适配器模式

在 Swift 中,实现适配器相当简单。你只需要创建一个新对象,把旧对象放进去,然后在新对象的类或者结构体上实现要求的接口。换言之,这个将源角色包装起来的类就是我们用来适配目标接口的适配器。

源角色

我们要适配目标接口的对象(例如,旧的USB-A接口)。

适配器

包装原始对象并且实现某个目标接口要求的对象。

目标

需要和源角色一起使用的对象 (我们的USB-C插槽)。

 

Swift中如何使用适配器模式?

当你想要在代码中集成第三方库时,可以用到适配器。第三方库的接口可能不符合你的需求,因此你可以在整个SDK或者后端API节点上创建一个包装器,以便提供统一的接口。👽

举个例子,我们将包装一个 EKEvent 对象,实现一个全新的协议。📆

import Foundation 
import EventKit

// 目标的协议
protocol Event {
    var title: String { get }
    var startDate: String { get }
    var endDate: String { get }
}

// 适配器 (包装类)
class EventAdapter {

    private lazy var dateFormatter: DateFormatter = {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy. MM. dd. HH:mm"
        return dateFormatter
    }()

    private var event: EKEvent

    init(event: EKEvent) {
        self.event = event
    }
}

// 实际的适配器实现
extension EventAdapter: Event {

    var title: String {
        return self.event.title
    }
    var startDate: String {
        return self.dateFormatter.string(from: event.startDate)
    }
    var endDate: String {
        return self.dateFormatter.string(from: event.endDate)
    }
}

// 创建 EKEvent 源对象实例
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MM/dd/yyyy HH:mm"

let calendarEvent = EKEvent(eventStore: EKEventStore())
calendarEvent.title = "Adapter tutorial deadline"
calendarEvent.startDate = dateFormatter.date(from: "07/30/2018 10:00")
calendarEvent.endDate = dateFormatter.date(from: "07/30/2018 11:00")

// 我们以 Event 协议的形式使用适配器
let adapter = EventAdapter(event: calendarEvent)
// adapter.title
// adapter.startDate
// adapter.endDate

还有一种用法,当你不得不使用几个已经存在的类或者结构体,而这些类都是 final 的,并且缺少某些功能,因此你需要基于它们之上构建一些新的接口。这种情况下,最好的选择就是实现一个包装类,也就是适配器。🤷‍♂️

其实不仅是 Swift,基本上在所有的编程语言中,适配器都很容易实现,它们是如此的不可或缺。😉

 

我的公众号 这里有Swift及计算机编程的相关文章,以及优秀国外文章翻译,欢迎关注~