ZOOC 소셜로그인 어뎁터 패턴으로 바꾸기
==========================================
서로 다른 인터페이스를 가진 객체를 함께 사용할 수 있도록 해주는 디자인 패턴
조금 더 풀어서 말을 해보자면
현재 A기능을 사용중일 때 이와 유사한 B, C의 기능이 계속 생겨나면서 B,C 인터페이스도 A와 동일하게 만드는 것을 목적으로 하는 것이다!
마치 C타입 맥북 단자에 USB를 연결해주는 말 그대로 **어뎁터
**와 같은 역할입니다!
대표적인 예시로는 AuthService를 만들어 놓았을때,
다양한 소셜로그인을 붙이고 싶을때 아래처럼 추가가 된다면 같은 기능을 하는 코드가 소셜로그인 개수만큼 만들어질겁니다 아래처럼요!
enum AuthError: Error {
}
struct User {
let id: String
let name: String
let age: Int
}
protocol AuthServiceType {
func login(email: String, password: String, completion: (Result<(User), AuthError>) -> ())
}
final class AuthService: AuthServiceType {
func login(email: String, password: String, completion: (Result<(User), AuthError>) -> ()) {
// login 시도
completion(.success(()))
}
}
struct NaverUser {
let naverID: String
let name: String
let email: String
}
class NaverAuthService {
func login(email: String, password: String, naverKey: String, completion: (Result<(NaverUser), AuthError>) -> ()) {
}
}
struct KakaoUser {
let kakaoID: String
let name: String
let email: String
}
class KakaoAuthService {
func login(email: String, password: String, kakaoKey: String, completion: (Result<(KakaoUser), AuthError>) -> ()) {
}
}
class ViewController: UIViewController {
let authService: AuthServiceType = AuthService()
// new
let naverAuthService = NaverAuthService()
let kakaoAuthService = KakaoAuthService()
override func viewDidLoad() {
super.viewDidLoad()
authService.login(email: "email", password: "password") {
print($0)
}
naverAuthService.login(email: "email", password: "password", naverKey: "naverKey") {
print($0)
}
kakaoAuthService.login(email: "email", password: "password", kakaoKey: "kakaoKey") {
print($0)
}
}
}
Adapter
: Client, Adaptee를 모두 사용할 수 있도록 도와줌