반응형
Adapter Pattern?
- 어댑터 패턴 : 서로 간의 호환성이 없는 인터페이스를 함께 동작할 수 있게 해주는 디자인 패턴
예를 들어, Ethernet Port와 USB Port가 있다고 가정해보자!
둘간의 Port는 절대로 같이 연결할 수 없다.
하지만, 중간고리 역할(Adapter)이 있다면 둘 간의 연결은 가능해진다!
Why Adpater?
그럼 어떨 때 Adapter 패턴을 적용하고, 왜 써야 할까?
- Client는 Target 인터페이스만 알면, 실체화된 Adapter 객체가 알아서 로직을 흐르게 해준다!
- Adapter는 Adaptee를 이용하여 요청에 대한 결과를 반환하게 된다!
- Client의 입장에서 Target에서의 Adaptee의 존재를 눈치채지 못하고 숨길 수 있다!
한마디로, 엄~~~청 유연해지고, 재사용성이 높아진다는 말이다!
그러면 장단점이 무엇일까?
장점
- 코드의 재사용성, 유연성을 제공한다!
- Adapter 객체는 다형성을 이용해서, 로직을 바꾸거나 정체성을 바꿀 수 있다!
단점
- 요청이 서로 전달되는 방식이므로, Overhead가 크다
- 복잡한 로직의 경우, Adpater 체인을 계속해서 개선해야 되는 불편함이 있다
예시 코드
Car라는 인터페이스가 있다고 가정하자!
package designpattern.adapter;
interface Car {
String drive();
}
1. Car 인터페이스 구현
Car를 실체화해서 HyundaiCar와 KiaCar라는 자동차를 구현해보았다!
package designpattern.adapter;
class HyundaiCar implements Car {
@Override
public String drive() {
return "Broong Broong";
}
}
package designpattern.adapter;
public class KiaCar implements Car {
@Override
public String drive() {
return "Go Go";
}
}
2. Hyundai/Kia Car 클래스
우리는 실제 자동차를 만들었으니, 장난감 자동차를 한번 만들어볼까 한다!
장난감 자동차에는 사용자가 직접 움직이라고 명령을 내릴 수가 있다!
package designpattern.adapter;
interface ToyCar {
String moveActionToCar();
}
3. ToyCar 인터페이스
그러면, 장난감 자동차는 자동차가 움직이는 소리를
자동차의 유형에 따라서 소리를 바꿀 수 있다!!
package designpattern.adapter;
public class CarAdapter implements ToyCar {
private final Car car;
public CarAdapter(final Car car) {
this.car = car;
}
@Override
public String moveActionToCar() {
return "Toy Car : " + car.drive();
}
}
4. CarAdapter 클래스 구현
만약에 현대차가 아닌 기아차가 생성자로 들어오게 되면,
Adapter의 로직은 그대로 유지하면서, 기대하는 결과값은 바꿀 수 있게 된다!
package designpattern.adapter;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
class CarAdapterTest {
@Test
void 장난감_현대차가_제대로_동작하는지_확인() {
/* Given */
Car car = new HyundaiCar();
ToyCar toyCar = new CarAdapter(car);
/* Then */
assertThat(toyCar.moveActionToCar()).isEqualTo("Toy Car : Broong Broong");
}
@Test
void 장난감_기아차가_제대로_동작하는지_확인() {
/* Given */
Car car = new KiaCar();
ToyCar toyCar = new CarAdapter(car);
/* Then */
assertThat(toyCar.moveActionToCar()).isEqualTo("Toy Car : Go Go");
}
}
5. CarAdapterTest 클래스 구현
테스트는 당연히 통과된다!
정리
- ToyCar의 moveActionToCar 메서드를 호출하게 되면 Adpatee는 숨기면서 결과를 요청받을 수 있다!
참고
Adpater Pattern - GeeksforGeeks
어댑터 패턴
반응형
'Developer > Design Pattern' 카테고리의 다른 글
Composite Pattern - 컴포지트 패턴 (0) | 2019.11.06 |
---|---|
Command Pattern - 커맨드 패턴 (2) | 2019.10.19 |
Factory Method Pattern - 팩토리 메서드 (0) | 2019.06.21 |
Abstract Factory Pattern - 추상팩토리 패턴 (0) | 2019.06.18 |
Template Method Pattern - 템플릿 메소드 패턴 (0) | 2019.06.09 |