한 크래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환한다.
어댑터를 이용하여 인터페이스 호환성문제를 해결할 수 있다.
어댑터를 이용하면 호환되지 않는 충전기도 사용할 수 있다.
이처럼 어댑터 디자인 패턴을 사용하는 경우 서로 호환되지 않는 인터페이스를 사용하는 클라이언트를 그대로 활용할 수 있다.
인터페이스를 변환해주는 어댑터만 만들면 되니까!
이를 통해 클라이언트와 구현된 인터페이스를 분리할 수 있고, 나중에 인터페이스가 바뀌더라도 그 변경 내역은 어댑터에 캡슐화되기 때문에 클라이언트는 바뀔 필요가 없어진다.
Target: interface 정의
protocol LightningPhone {
func recharge()
func useLightning()
}
protocol MicroUSBPhone {
func recharge()
func useMicroUSB()
}
Adaptee 정의
class Iphone: LightningPhone {
var connector: Bool = false
public func recharge() {
if (connector) {
print("Recharge Started")
print("Recharge finished")
} else {
print("Connect Lightning first")
}
}
public func useLightning() {
connector = true
print("Lightning connected")
}
}
class Android: MicroUSBPhone {
var connector: Bool = false
func recharge() {
if (connector) {
print("Recharge Started")
print("Recharge finished")
} else {
print("Connect MocroUSB first")
}
}
func useMicroUSB() {connector = true
print("MicroUSB connected")
}
}
Adapter 정의
class LightningToMicroUSBAdapter: MicroUSBPhone {
private final var lightningPhone: LightningPhone
init(_ lightningPhone: LightningPhone) {
self.lightningPhone = lightningPhone
}
public func lightningToMicroUSBAdapter(lightningPhone: LightningPhone) {
self.lightningPhone = lightningPhone
}
func recharge() {
lightningPhone.recharge()
}
func useMicroUSB() {
print("MicroUSB connected")
lightningPhone.useLightning()
}
}
Clinet 정의
func rechargeMicroUSBPhone(phone: MicroUSBPhone) {
phone.useMicroUSB()
phone.recharge()
}
func rechargeLightingPhone(phone: LightningPhone) {
phone.useLightning()
phone.recharge()
}
let android = Android()
let iphone = Iphone()
print("Recharging android with MicroUSB")
rechargeMicroUSBPhone(phone: android)
print("Recharging iphone with Lighting")
rechargeLightingPhone(phone: iphone)
print("Recharging iphone with MicroUSB")
rechargeMicroUSBPhone(phone: LightningToMicroUSBAdapter(iphone)
Recharging android with MicroUSB
MicroUSB connected
Recharge Started
Recharge finished
Recharging iphone with Lighting
Lightning connected
Recharge Started
Recharge finished
Recharging iphone with MicroUSB
MicroUSB connected
Lightning connected
Recharge Started
Recharge finished