어댑터 패턴은 서로 다른 인터페이스를 가진 클래스들을 소스 코드를 변경하지 않고도 함께 동작하게 만들어 주는 패턴입니다. 이 패턴은 일상에서도 쉽게 볼 수 있는데, 안드로이드 폰과 아이폰의 충전 단자가 대표적인 예입니다.
아이폰은 라이트닝 단자를, 안드로이드는 마이크로핀 단자를 사용합니다. 둘은 서로 맞지 않지만, 변환기를 끼우면 한쪽 인터페이스를 다른 쪽이 기대하는 형태로 바꿔 줄 수 있습니다. 이 변환기 역할을 코드로 옮긴 것이 바로 어댑터입니다.
이런 상황을 TypeScript로 어떻게 구현할 수 있는지 코드 예제로 살펴보겠습니다.
typescript
복잡한 코드를 하나의 메서드 뒤에 숨기는 퍼사드 패턴의 개념과 활용법을 TypeScript 예제로 정리합니다.
2022. 7. 30.Frontend단계 쪼개기와 다형성으로 조건문을 대체해 계산 로직과 출력 로직을 분리하는 리팩터링을 다룹니다.
2022. 5. 7.Frontend타입스크립트에서 여러 객체를 동시에 상속받을 수 있게 해주는 Mixin 패턴을 알아봅니다.
2022. 4. 29.interface IIPhone {
useLigthening:()=>void;
}
interface IAndroid {
useMicroPin:()=>void;
}
class IPhone implements IIPhone {
useLigthening() {
console.log("being charged by lightening")
}
}
class Galaxy implements IAndroid{
useMicroPin() {
console.log("being charged by micro pin");
}
}
class LighteningToMicropinAdapter implements IAndroid{
iphone:IPhone;
constructor(iphone:IPhone) {
this.iphone = iphone
}
useMicroPin() {
console.log("using micro pin, which is converting to lightening");
this.iphone.useLigthening();
}
}LighteningToMicropinAdapter는 IAndroid 인터페이스를 구현하므로 마이크로핀을 기대하는 쪽에서 그대로 사용할 수 있습니다. 내부적으로는 주입받은 IPhone 인스턴스의 useLigthening()을 호출해, 마이크로핀 요청을 라이트닝 동작으로 변환합니다. IPhone 클래스는 전혀 수정하지 않았다는 점이 핵심입니다.
어댑터 패턴은 이미 존재하는 클래스를 사용하고 싶지만 그 인터페이스가 우리가 필요로 하는 형태와 맞지 않을 때 유용합니다.
클래스를 전혀 변경하지 않고도 코드를 확장할 수 있고, 서로 다른 클래스들이 함께 동작하며 호환되도록 만들 수 있습니다. 이는 SOLID 원칙 중 하나인 개방-폐쇄 원칙(The Open-Closed Principle)과 관련이 있습니다.