어댑터 패턴(Adapter Pattern)
1. 목적
- 클래스의 인터페이스를 클라이언트가 원하는 형태의 또다른 인터페이스로 변환시켜준다.
- 어댑터는 호환되지 않는 인터페이스 때문에 동작하지 않는 클래스들을 함께 동작할 수 있도록 만들어준다.
2. 역할
객체를 감싸는 역할을 한다(Object wrapping)
- 서로호환되지 않는 두 개의 인터페이스를 연결하는 작업
- 서로 다른 인터페이스를 동일하게 변환해준다.
Ex ) 전기 플러그
서로 다른 플러그(유럽, 미국)의 경우 어댑터를 사용해서 변환시킬 수 있다.
요소 | 설명 |
이름 | 어댑터(Adapter) |
문제 | 사용 객체의 API가 서로 다른 문제 |
해결방안 | 함수를 변환하는 객체를 중간에 넣어준다. |
결과 | 변경의 최소화 |
3. 문제상황
어댑터 패턴을 사용한 문제 상황 해결 방안.
4. 정의
<Adapter Pattern을 사용해 DataCollection에 해당하는 내용을 ArrayList로 구현한 코드>
// client - 업체에서 제공한 클래스
package AdapterPattern;
import java.util.Iterator;
import java.util.ArrayList;
public class TestDynamicArray {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
// 여기서는 만들어진 어댑터 클래스가 ArrayListDataCollectionAdapter라고 가정함. 다른 이름으로 만들었다면
// 다음 코드를 수정할 것
DataCollection<String> arr2 = new ArrayListDataCollectionAdapter<String>(list);
arr2.put("Seoul");
arr2.put("Busan");
arr2.put("Gwangju");
arr2.put("Daejeon");
arr2.put("Cheonan");
arr2.put("Ulsan");
arr2.put("Daegu");
arr2.put("Incheon");
System.out.println("index");
for (int i = 0; i < arr2.length(); i++) {
String s = (String) arr2.elemAt(i);
System.out.println(s);
}
System.out.println("\niterator");
for (Iterator iter = arr2.createIterator(); iter.hasNext(); ) {
String s = (String) iter.next();
System.out.println(s);
}
System.out.println("\nfor-each");
for (String s : arr2) {
System.out.println(s);
}
}
}
// Target - 인터페이스
package AdapterPattern;
import java.util.Iterator;
public interface DataCollection<T> extends Iterable<T> {
boolean put(T t);
T elemAt(int index);
int length();
Iterator createIterator();
}
// Adapter
package AdapterPattern;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ArrayListDataCollectionAdapter<T> implements DataCollection<T>, Iterable<T> {
List<T> list;
ArrayListDataCollectionAdapter(ArrayList<T> list) {
this.list = list;
}
@Override
public boolean put(T t) {
return list.add(t);
}
@Override
public T elemAt(int index) {
return list.get(index);
}
@Override
public int length() {
return list.size();
}
@Override
public Iterator createIterator() {
return list.iterator();
}
@Override
public Iterator iterator() {
return list.iterator();
}
}
'Java > 고급객체지향' 카테고리의 다른 글
고급객체지향 프로그래밍 - 커맨드 패턴(Command Pattern) (0) | 2021.12.12 |
---|---|
고급객체지향 프로그래밍 - 퍼사드 패턴(Facade Pattern) (0) | 2021.12.12 |
고급객체지향 프로그래밍 - 다오 패턴(DAO Pattern) (0) | 2021.12.12 |
고급객체지향 프로그래밍 - 싱글턴 패턴(Singleton Pattern), 반복자 패턴(Iterator Pattern) (0) | 2021.10.19 |
고급객체지향 프로그래밍 - 팩토리 메소드 패턴(Factory Method Pattern) (0) | 2021.10.19 |