코드/GOF

디자인패턴 - 구조(Structual)패턴 (1) 어댑터(Adapter)

미로처럼 2024. 3. 12. 17:17
728x90

화환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들을 함께 작동해주도록 변환

 

 

클래스의 인터페이스를 다른 인터페이스로 변환하여 다른 클래스가 이용할 수 있도록 하는 패턴

legacy 인터페이스를 감싸서 새로운 인터페이스로 변환하기 때문에 wrapper 패턴이라고도 불리운다.

 

 

객체 어댑터 

합성(Composition)된 멤버에게 위임을 이용한 어댑터 패턴

자기가 해야 할 일을 클래스 멤버 객체의 메소드에 다시 전달 함으로써 목적을 달성하는 것을 위임이라고 함

합성을 활용했기 때문 런타임 중에 Adpatee(기존객체)(Service)가 결정되어 유연하다.

그러나 Adaptee 객체를 필드 변수로 저장해야 되기 때문에 공간차지 비용 든다

 

Adaptee(Service): 어댑터 대상 객체, 기존 시스템 / 외부 시스템/ 써드파티 라이브러리

Target(Client Interface): Adapter가 구현하는 인터페이스.

Adapter : Client 와 Adaptee(service)  중간에 호환성이 없는 둘을 연결시켜주는 역할을 담당.

Client: 기존 시스템을 어댑터를 통해 이용하려는 쪽. Client Interface 통하여 Service 를 이용

 

 

클래스 어댑터 

 

클래스 상속을 이용한 어댑터 패턴

Adaptee (Servcie)를 상속했기 때문에 따로 객체 구현없이 바로 코드 재사용이 가능. 

상속은 대표적으로 기존에 구현된 코드를 재사용하는 방식이지만, 자바에서는 다중 상속 불가 문제 떄문에 전반적으로 권장하지 않는 방법

 

 

 Adaptee(Service): 어댑터 대상 객체. 기존 시스템 / 외부 시스템 / 써드파티 라이브러리

Target(Client Interface):  ADapter rㅏ 구현하는 인터페이스 

Adapter: Client 와 Adaptee(Service) 중간에서 호환성이 없는 둘을 연결시켜주는 역할을 담당.

Class Adaptor 방식에선 상속을 이용해 구성

Existing class와 Aapatee(Service)를 동시에 implements ,extends하여 구현

Client: 기존 시스템을 어댑터를 통해 이용하려는 쪽 , Client, Interface 를 통하여 Service 를 이용할 수 있게 된다.

 

 

특징

 

사용 시기

레거시 코드를 사용하고 싶지만 새로운 인터페이스가 레거시 코드와 호환되지 않을때 

이미 만든 것을 재사용하고자 하나 이 재사용 가능한 라이브러리를 수정할 수 없을 때

이미 만들어진 클래스를 새로운 인터페이스(API)에 맞게 개조할때

소프트웨어의 구 버전과 신 버전을 공존시키고 싶을때

 

장점

프로그램의 기본 비즈니스 로직에서 인터페이스 또는 데이터 변환 코드를 분리할 수 있기 떄문에 단일 책임 원칙(SRP)를 만족한다.

 

기존 클래스 코드를 건들지 안혹 클라이언트 인터페이스를 통해 어댑터와 작동하기 때문에 개방폐쇄원칙(OCP)을 만족한다. 

 

만일 추가로 필요한 메소드가 ㅍ있다면 어댑터에 빠르게 만들 수 있다 만약 버그가 발생해도 기존의 클래스에는 버그가 없으므로 Adapter 역할의 클래스를 중점적으로 조사하면 되고, 프로그램 검사도 쉬워진다.

 

 

단점

새로운 언터페이스와 어댑터 클래스 세트를 도입해야 하기 떄문에 코드의 복잡성이 증가한다. 

때로는 직접 서비스 (Aaptee)클래스를 변경하는 것이 간단 할 수 있는 경우가 있기 떄문에 신중히 선택하여야 한다. 

 

 

 

 

728x90