更多内容,欢迎关注公众号:Swift花园
喜欢文章?不如来点赞关注吧
将一个不兼容的对象转换成目标接口或者类,这是适配器模式的作用。
下面这件东西是适配器模式在现实世界中最贴切的表达。😜


适配器是一种结构化的设计模式,使得各种互不兼容的接口可以协同工作。换言之,它对一个对象的接口做转换,以对接另一个不同对象的接口。
因为适配器能够做变换,所以它有时候也被称为“包装器”:把一个对象包裹起来,然后提供一个新的接口。 😂
实现适配器模式
在 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及计算机编程的相关文章,以及优秀国外文章翻译,欢迎关注~