目的
- 担任两个不兼容的接口之间的桥梁,将类接口转换成客户希望的另一个接口
实现思想
- 适配器内部通过继承、组合方式,将来自某接口的操作转换给另一个接口=
内部角色
- Target:目标接口
- Adaptee:被适配类,实现了客户希望的接口
- Adapter:适配器,协调Target与Adaptee的请求转换
实现方式
类适配器、对象适配器
类适配器
- 重点类:Adapter
- 通过继承Adaptee,拥有被适配类的功能
- 通过实现Target接口,拥有作为插口的能力
- 针对对Target接口的方法实现中,调用继承自Adaptee的功能,转换操作请求
- 示例
// Target
interface IComputerNetwork {
fun internet()
}
// Adaptee1
open class WangKa {
fun wifiConnect() {
System.out.println("Wifi 连接网络")
}
}
// Adaptee2
open class WangXian {
fun lineConnect() {
System.out.println("有线 连接网络")
}
}
// Adapter
class WangKaUsbAdapter : WangKa(), IComputerNetwork {
override fun internet() {
super.wifiConnect()
}
}
// Adapter
class WangXianUsbAdapter : WangXian(), IComputerNetwork {
override fun internet() {
super.lineConnect()
}
}
// User
class Computer {
// 主机的上网功能
fun internet(adapter: IComputerNetwork) {
// 通过适配器,适配到真正提供上网的类
adapter.internet()
}
companion object {
@JvmStatic
fun main(args: Array<String>) {
val computer = Computer()
computer.internet(WangKaUsbAdapter())// 通过网卡联网,联网任务交给最终的网卡
computer.internet(WangXianUsbAdapter())// 通过网线联网,联网任务交给最终的网线
}
}
}
对象适配器
- 重点类 :Adapter
- 通过构造器,传入一个Adaptee对象,以此拥有被适配类的功能
- 还是一样,通过实现Target拥有插口能力
- 在Target实现方法内,使用组合的Adaptee对象转换操作请求
- 示例
// Target
interface IComputerNetwork {
fun internet()
}
// Adaptee abstract
interface IInternet {
fun connect()
}
// Adaptee1
open class WangKa : IInternet {
override fun connect() {
System.out.println("Wifi 连接网络")
}
}
// Adaptee2
open class WangXian : IInternet {
override fun connect() {
System.out.println("有线 连接网络")
}
}
// Adapter
class InternetAdapter(var adaptee: IInternet) : IComputerNetwork {
override fun internet() {
adaptee.connect()
}
}
// User
class Computer {
fun internet(adapter: IComputerNetwork) {
adapter.internet()
}
companion object {
@JvmStatic
fun main(args: Array<String>) {
// 使用者用法不一样了
val computer = Computer()
val adaptee = WangKa()
val adaptee2 = WangXian()
val adapter = InternetAdapter(adaptee2)
computer.internet(adapter)
}
}
}