어댑터 패턴이란
어댑터패턴은 위의 사진과 같은 개념으로 특정 인터페이스(220V)를 다른 인터페이스(110V)에 맞게 작동할 수 있또록 변환을 도와주는 패턴이다.
다이어그램
객체 어댑터
Adaptee 클래스는 변환될 대상이며, Target 인터페이스는 변환할 목표이다.
Adapter 클래스는 Target 인터페이스를 구현하고 Adaptee를 구성으로 가져와 Target 인터페이스의 구현에 맞게 특정 기능을 호출한다.
클래스 어댑터
클래스어댑터는 객체 어댑터와 다르게 이중상속을 통해 변환과정을 진행한다.
예
리스트나 컬렉션에서 요소들을 순회하여 조회하기 위해 Iterator, Enumeration 2개의 반복자가 사용된다. Iterator가 범용적으로 사용되기 때문에 Enumeration을 Iterator에 맞게 수정할 필요가 있다.
메소드는 크게 다음 요소가 있는지 확인하는 hasMoreElements, hasNext 와 다음 요소를 반환하는 nextElement, next 메소드가 있다. 이 둘을 연결할 수 있도록 Enumeration을 Iterator 형식으로 바꿀 수 있는 어댑터 클래스를 작성해보면 아래와 같다.
// 변환할 목표의 인터페이스 Iterator를 구현함.
public class EnumAsIterator implements Iterator<Object> {
private Enumeration<?> t;
public EnumAsIterator(Enumeration<?> t) {
// 기존의 Enumeration을 구성으로 가져옴
this.t = t;
}
@Override
public boolean hasNext() {
// Iterator의 hasNext에 Enumeration의 hasMoreElements 대응
return t.hasMoreElements();
}
@Override
public Object next() {
// Iterator의 next에 Enumeration의 nextElement 대응
return t.nextElement();
}
}
어댑터의 클래스를 Target 인터페이스(Iterator)를 구현 후 Adaptee 클래스 (Enumeration)를 구성으로 가져와 인터페이스의 구현에 맞게 대응하여 작성하였다.
아이러니 하게도 Enumeration 인터페이스에서는 Iterator 변환을 asIterator() 메소드로 제공해주고 있는데 별도의 어댑터를 사용하지 않고 아래와 같이 변환한다.
// Enumeration.java
default Iterator<E> asIterator() {
return new Iterator<>() {
@Override
public boolean hasNext() {
return hasMoreElements();
}
@Override
public E next() {
return nextElement();
}
};
}
'디자인패턴' 카테고리의 다른 글
커맨드 패턴 (Command Patter) (0) | 2022.11.17 |
---|---|
데코레이터 패턴(Decorator Pattern) (0) | 2022.10.21 |
옵저버 패턴 (Observer Pattern) (2) | 2022.10.19 |
전략 패턴 (Strategy Pattern) (0) | 2022.09.15 |