Adapter

pcsoyeon·2021년 12월 1일
0

Adapter is a structural design pattern that allows objects with incompatible interfaces to work together. In other words, it transforms the interface of an object to adapt it to a different object.

어댑터 패턴은 서로 다른 인터페이스를 가진 객체를 함께 사용할 수 있도록 해주는 디자인 패턴이다.
(IT 디바이스의 USB-C 타입과 8핀 타입을 연결하는 어댑터를 생각하면 더 쉽게 생각할 수 있다.)

그래서 어댑터는 하나의 객체를 다른 객체로 변환시킬 수 있으며 객체를 감싸고 그 주위에 새로운 인터페이스를 제공하므로 Wrapper라고 말하기도 한다.

Swfit에서 어댑터 패턴을 만드는 것은 쉽다. 새로운 객체를 만들고 이전 객체를 "box"에서 새로운 클래스나 구조체에 필요한 인터페이스를 구현하면 된다.
즉, Wrapper은 Adapter가 되서 다른 Adaptee를 target interface에 맞도록 wrapping한다.

Object

Adaptee

특정 target에 adapting할 객체를 말한다. (예전 버전인 USB-A port를 예시로 들 수 있다.)

Adapter

기존의 것을 wrap하고 특정 target interface에 맞는 새로운 조건들을 제공하는, 중간 다리 역할을 말한다. (각 포트를 연결해주는 어댑터를 생각할 수 있다.)

Target

Adaptee를 연결해서 실제로 사용하고 싶은 객체를 말한다. (USB-C 소켓을 말한다.)

구현

Models

import Foundation

protocol Event: class {
    var title: String { get }
    var startDate: String { get }
    var endDate: String { get }
}

extension Event {
    var description: String {
        return "Name: \(title)\nEvent start: \(startDate)\nEvent end: \(endDate)"
    }
}

class LocalEvent: Event {
    var title: String
    var startDate: String
    var endDate: String
    
    init(title: String, startDate: String, endDate: String) {
        self.title = title
        self.startDate = startDate
        self.endDate = endDate
    }
}

Adapter

import Foundation
import EventKit

// Adapter
class EKEventAdapter: Event {
    private var event: EKEvent
    
    private lazy var dateFormatter: DateFormatter = {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "MM-dd-yyyy HH:mm"
        return dateFormatter
    }()
    
    var title: String {
        return event.title
    }
    var startDate: String {
        return dateFormatter.string(from: event.startDate)
    }
    var endDate: String {
        return dateFormatter.string(from: event.endDate)
    }
    
    init(event: EKEvent) {
        self.event = event
    }
}

Usage (Adaptee)

import UIKit
import EventKit

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Usage
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "MM/dd/yyyy HH:mm"

        let eventStore = EKEventStore()
        let event = EKEvent(eventStore: eventStore)
        event.title = "Design Pattern Meetup"
        event.startDate = dateFormatter.date(from: "06/29/2018 18:00")
        event.endDate = dateFormatter.date(from: "06/29/2018 19:30")

        let adapter = EKEventAdapter(event: event)
        adapter.description
    }
    
}

구현 결과

Name: Design Pattern Meetup
Event start: 06-29-2018 18:00
Event end: 06-29-2018 19:30

또 다른 사용 사례는 몇가지 최종 클래스들 또는 구조체들을 사용해야 하는데 몇가지 기능이 부족하거나 그 위에 새로운 target interface를 구축하려고 할 때 사용할 수 있다.

profile
Slowly But Surely

0개의 댓글