클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴으로, 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 해준다.
- 기존 비즈니스 로직을 포함하는 클래스
- Client 코드에 드러날 Adapter의 기능
- Client와 호환되지 않는 인터페이스인 직접 사용할 수 없는 클래스, 이미 존재하는 인터페이스를 가지고 있는 클래스
- Client와 Adapter 모두와 함께 일할 수 있는 클래스, Adaptee 객체를 wrapping해서 Client 인터페이스를 구현
- 이미 존재하는 클래스의 인터페이스를 변경하지 않고도 그 클래스를 사용할 수 있개 해준다.
- 기존의 코드를 재사용하면서 새로운 인터페이스 요구사항을 충족시킬 수 있다.
- 전체 코드 복잡성이 증가할 수 있다. 새로운 인터페이스를 추가하는 것은 항상 코드 복잡성을 증가시킨다.
- Adaptee를 extension하거나 변경하는게 더 간단할 수 있다.
// Target
protocol NewCharging {
func charge()
}
// Adaptee
class OldChargingImplementation {
func specificCharge() {
print("Charging with old charger")
}
}
// Adapter
class ChargerAdapter: NewCharging {
var oldCharger: OldChargingImplementation
init(oldCharger: OldChargingImplementation) {
self.oldCharger = oldCharger
}
func charge() {
oldCharger.specificCharge()
}
}
// Client
let oldCharger = OldChargingImplementation()
let adapter = ChargerAdapter(oldCharger: oldCharger)
adapter.charge()
NewCharging
은 Target, OldChargingImplementation
은 Adaptee, ChargerAdapter
는 Adapter 역할을 합니다. 클라이언트는 NewCharging
인터페이스를 통해 충전을 수행하려고 합니다. OldChargingImplementation
으로, specificCharge
라는 다른 메서드를 통해 충전을 수행합니다. 이 때 ChargerAdapter
를 사용하면 OldChargingImplementation
의 specificCharge
메서드를 NewCharging
의 charge
메서드로 변환하여 클라이언트가 사용할 수 있게 해줍니다.// Target
protocol NewJsonParser {
func parse(data: Data) -> [String: Any]
}
// Adaptee
class OldJsonParser {
func specificParse(from data: Data) -> [String: Any]? {
// Parsing Logic
return nil
}
}
// Adapter
class JsonParserAdapter: NewJsonParser {
var oldParser: OldJsonParser
init(oldParser: OldJsonParser) {
self.oldParser = oldParser
}
func parse(data: Data) -> [String: Any?] {
return oldParser.specificParse(from: data)
}
}
// Clinet
let oldParser = OldJsonParser()
let adapter = JsonParserAdapter(oldParser: oldParser)
let jsonData = Data()
let result = adapter.parse(data: jsonData)
제가 학습한 내용을 요약하여 정리한 것입니다. 내용에 오류가 있을 수 있으며, 어떠한 피드백도 감사히 받겠습니다.
감사합니다