1. Adapter 패턴이란
이미 구현되어 있는 코드가 있는데, 둘이 연결 좀 시켜주고 싶을 때가 있죠. 어떤 좋은 메서드가 있는데, 인자로 A라는 형식을 받습니다. 근데, 이미 구현되어 있는 코드에는 B라는 형식으로 구현되어 있습니다. 이럴 때, B를 A의 형식으로 바꿔주면 좋은 메서드를 써먹을 수 있습니다. Adapter 패턴은 어떤 오브젝트를 캐스팅이 불가능한 다른 클래스의 형태로 변환시켜주는 것입니다.
2. 따라하기
// Adapter Class
package com.designpattern.adapter;
import java.util.Enumeration;
import java.util.Iterator;
public class IteratorToEnumeration implements Enumeration {
private Iterator iter;
public IteratorToEnumeration(Iterator iter){
this.iter = iter;
}
@Override
public boolean hasMoreElements() {
return iter.hasNext();
}
@Override
public String nextElement() {
return iter.next();
}
}
//test 클래스
package com.designpattern.adapter;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
public class Test {
public static void nextObject(Enumeration enumer){
while (enumer.hasMoreElements()){
System.out.println(enumer.nextElement());
}
}
public static void main(String[] args){
List list = new ArrayList();
list.add("first");
list.add("second");
list.add("third");
Enumeration ite = new IteratorToEnumeration(list.iterator());
nextObject(ite);
}
}
//결과
first
second
third
우리가 최종적으로 쓰고자하는 것은 nextObject() 입니다. 그 녀석은 인자로 Enumeration을 받고 있지요.
그러나 우리가 가지고 있는 것은 Iterator입니다. IteratorToEnumeration 클래스는 Iterator를 받아서 Enumeration 으로 변경시켜줍니다.
A to B의 형태를 가지는 Adapter는 A를 멤버변수로 가지고 B를 구현합니다.
즉, IteratorToEnumeration 클래스가 이 역활을 하고 있습니다. IteratorToEnumeration 이클래스가 아답터 클래스 입니다.
3. JAVA API에 있는 Adapter 패턴 을 이용한 클래스들
java.util.Arrays#asList()
java.util.Collections#list()
java.util.Collections#enumeration()
java.io.InputStreamReader(InputStream) (returns a Reader)
java.io.OutputStreamWriter(OutputStream) (returns a Writer)
javax.xml.bind.annotation.adapters.XmlAdapter#marshal() and #unmarshal()
이클립스나 인텔리 제이에서 저 소스들을 파헤쳐 가면서 어떻게 adapter 패턴들을 사용했는지 한번 살펴보시기 바랍니다.
시간이 될때 저도 저 클래스들이 apater 패턴을 사용하는가를 작성하겠습니다.
'프로그래밍 > JAVA' 카테고리의 다른 글
Template 패턴 (0) | 2020.02.01 |
---|---|
Builder 패턴 (0) | 2020.02.01 |
Iterator 패턴 (0) | 2020.02.01 |
Factory 패턴 (0) | 2020.02.01 |
디자인패턴 종류별 간단 암기 노트 (0) | 2020.01.30 |
댓글