class OurCompany {
static func insertData() {
// 우리 회사가 사용하고 있는 코드 내역
}
}
class NewlyContractedCompany {
// 데이터를 입력하는 코드가 우리 회사의 것과 다르기 때문에 호환 불가능.
// 어떻게 해야 이 문제를 처리할 수 있을까?
func insertData(_ specialData: Int) {
print("기존 서비스 기능 호출 + \(specialData)")
}
}
protocol AdapterProtocol {
func insertData(_ data: Int)
}
class Adapter: AdapterProtocol {
var adaptee = NewlyContractedCompany() // 다른 업체의 클래스를 생성
// "프로토콜에 있는 메소드 내부에다" 다른 업체의 클래스에 접근하여 코드를 실행.
// 이렇게 하면 후에 우리 회사 코드 측에서 다른 업체의 코드에 값을 전달할 수 있게 된다.
func insertData(_ data: Int) {
adaptee.insertData(data)
}
}
class OurCompany {
static func insertData() {
// 우리 회사 코드 내부에서 우리 회사와 다른 회사를 이어줄 "어댑터"를 생성
// 그러면 우리 회사 코드와 다른 업체 코드가 서로 호환되게 됨.
let adapter: AdapterProtocol = Adapter()
// "어댑터 프로토콜(Target)을 통해서" 어댑터의 메소드에 값을 전달.
// 우리 회사 측에서 값을 사용했으나 값이 다른 회사 측으로 넘어가는 것을 확인할 수 있다.
adapter.insertData(1)
}
}
// 결과를 확인해보면 분명히 우리 회사 쪽에서 값을 입력했는데
// 다른 회사의 코드로 값이 넘어갔음을 확인할 수 있음.
// 즉, 서로 다른 회사의 코드가 호환된 것이다!
OurCompany.insertData()
class OurCompany {
static func insertData() {
// 내가 사용하고 있는 코드 내역
}
}
class NewlyContractedCompany {
func insertData(_ specialData: Int) {
print("기존 서비스 기능 호출 + \(specialData)")
}
}
protocol AdapterProtocol {
func insertData(_ data: Int)
}
// 어댑터 클래스는 다른 회사 클래스와 어댑터 프로토콜을 같이 채택
// 그렇게 함으로써 다른 회사 클래스 내부의 메소드에 직접 접근이 가능하다.
class Adapter: AdapterProtocol, NewlyContractedCompany {
func insertData(_ data: Int) {
// 다른 회사 클래스 내부에 있는 메소드를 바로 호출한다. (상속받았으므로 가능한 일)
specificMethod(data)
}
}
class OurCompany {
static func insertData() {
// 우리 회사 클래스(Client) 측에서 어댑터를 생성한 후
let adapter: AdapterProtocol = Adapter()
// 어댑터 프로토콜(Target)에 존재하는 메소드를 통해서 값을 실행하면
// 우리 회사에서 값을 사용하지만 다른 회사의 코드에서 값이 실행되는 것을 확인할 수 있다.
adapter.insertData(1)
}
}
이전 프로젝트를 할 때 두 레이어를 연결해주기 위해 어댑터패턴을 사용한적이있었는데
원하고자하는 바는 이루었지만 레이어가 하나더 생긴다는 단점이존재했던것같아요
이미 여러 레이어를 쓰고있는데 추가로 하나의 레이어가 추가된다는것 자체가 부담이되었던지라 다시 어뎁터패턴을 지웠던경험이있는데 아무래도 이런부분도 꼭 고려를 해야한다는걸 느꼈던 경험이 있네요 ㅎㅎ
객체 어댑터와 클래스 어댑터로 분리 표현할 수 있군요! 어댑터 패턴만 알고 있었는데, 너무나 유용히 읽었습니다.
읽으며 궁금한 점이 있었는데, 객체 어댑터의 설명 예시에서 Adapter를 생성하기 위해 NewlyContractedCompany를 Client에서 직접 생성 주입하는 데에는 의도가 있었을까요? 읽으며 Client와 Apdatee의 결합을 낮추기 위해 Adapter라는 중간 객체가 있다고 이해하였습니다. 그렇기 때문에 Client 또한 Apadater 생성을 위해 필요한 NewlyContractedCompany를 상위에서 주입 받을 필요를 느끼기도 했습니다. Client가 외부 코드인 NewlyContractedCompany를 알지 못해야 (결합도를 낮추어) AdapterProtocol 프로토콜을 생성해 둔 것의 쓰임이 명확해지지 않을까 생각했기 때문입니다! 혹 나눠주실 생각이 있다면 감사히 듣겠습니다!
한 언어에서 다른 언어의 문법을 사용해야 할 때도 유용하게 쓸 수 있었습니다
Objective-C / Swift에서 C/C++ 헤더를 가진 파일을 사용해야 할때요
C++ 문법을 사용해야 되는 메서드를 Adapter 클래스에 다 넣고 그 클래스 외에서는 기존 언어의 문법을 사용하면 되더라고요
디자인패턴은 평소에 머리에 박혀 있어야 상황을 만났을 때 적용할 수 있는 것 같아요
어떤 패턴이 적합한 지 아는 것도 실력인가봐요