안녕하세요! Joy 입니다.
내친김에 어댑터 패턴까지 한번 알아보려고 합니당
군말없이 바로 시작하겠습니다!
Adapter Pattern 개요
어댑터패턴은 구조패턴의 일종으로 서로 호환되지 않는 객체들이 협업할 수 있도록 하는 패턴
실제 상황에서 생각해보기
문제 상황
만약 주식 시장에서 모니터링 앱을 만든다고 가정하자.
이 앱은 XML 형식의 소스에서 주식 데이터를 가져와서 차트와 다이어그램을 표시한다.
어느날 타사의 분석 라이브러리를 통합하여 앱을 개선하려고 한다. 그런데, 해당 라이브러리는 JSON 형태의 데이터에서만 작동한다.
XML과 함께 작동하도록 라이브러리를 변경할 수는 있지만 라이브러리에 의존하는 기존 코드를 손상시킬 수 있다.
처음부터 라이브러리 소스 코드에 액세스할 수 없어 이 접근 방식이 불가능해질 수도 있다.
해결법
이럴 때 어댑터를 생성한다. 어댑터는 한 개체의 인터페이스를 다른 개체가 이해할 수 있도록 변환하는 특수 개체이다.
어댑터는 데이터를 다양한 형식으로 변환할 수 있을 뿐만 아니라 다양한 인터페이스를 가진 개체가 협업하는데 도움이 될 수 있다.
- 어댑터는 기존 개체 중 하나와 호환되는 인터페이스를 가져옴
- 이 인터페이스를 사용하면 기존 개체가 어댑터의 매소드를 안전하게 호출한다.
- 호출을 수신하면 어댑터는 요청을 두번째 객체에 전달하지만, 두번째 객체가 예상하는 형식과 순서로 전달된다.
코드로 확인해보기
코드만 봐도 한번에 이해가 되시겠지만, 간단하게 설명을 해보자면 아래와 같다. (코드 출처는 하단에)
로그인 과정에서 Facebook과 Twitter SDK를 이용할건데, 둘은 다른 방식을 사용한다.
여기서 Adapter Pattern을 적용하려고 AuthService라는 프로토콜을 이용해 Facebook과 Twitter가 상속받도록 해줄건데,
상속 후 Twitter와 Facebook 모두 AuthService에 구현되어 있는 메소드를 구현해준다.
그리고 컴파일러에게 두 SDK 가 동일한 인터페이스를 가지고 있음을 컴파일러에 알려준다.
class AdapterRealWorld {
func testAdapterRealWorld() {
print("Starting an authorization via Facebook")
startAuthorization(with: FacebookAuthSDK())
print("Starting an authorization via Twitter.")
startAuthorization(with: TwitterAuthSDK())
}
func startAuthorization(with service: AuthService) {
/// The current top view controller of the app
let topViewController = UIViewController()
service.presentAuthFlow(from: topViewController)
}
}
protocol AuthService {
func presentAuthFlow(from viewController: UIViewController)
}
class FacebookAuthSDK {
func presentAuthFlow(from viewController: UIViewController) {
/// Call SDK methods and pass a view controller
print("Facebook WebView has been shown.")
}
}
class TwitterAuthSDK {
func startAuthorization(with viewController: UIViewController) {
/// Call SDK methods and pass a view controller
print("Twitter WebView has been shown. Users will be happy :)")
}
}
extension TwitterAuthSDK: AuthService {
/// This is an adapter
func presentAuthFlow(from viewController: UIViewController) {
print("The Adapter is called! Redirecting to the original method...")
self.startAuthorization(with: viewController)
}
}
extension FacebookAuthSDK: AuthService {
// FacebookAuthSDK
}
예시 코드 출처 : https://refactoring.guru/design-patterns/adapter/swift/example#example-1
간단하지만 말로 설명하려니.. 어렵네요.. 프로 블로거의 길은 아직 멉니다..
아무튼! 오늘은 Adapter Pattern에 대해서 알아봤습니다.
내용에 문제가 있으면 언제든 댓글주세요!
'💌 Design Pattern' 카테고리의 다른 글
[Design Pattern] Observer Pattern (옵저버패턴) with Swift (0) | 2022.02.22 |
---|---|
[Design Pattern] Factory Method Pattern (팩토리메소드패턴) with Swift (0) | 2022.02.18 |
[Design Pattern] Template Method Pattern (템플릿 메소드 패턴) with Swift (0) | 2022.02.16 |
[Design Pattern] Singleton Pattern (싱글톤패턴) with Swift (0) | 2022.02.14 |
[Design Pattern] SOLID (0) | 2022.02.13 |