Java/고급객체지향

고급객체지향 프로그래밍 - 어댑터 패턴(Adapter Pattern)

얄루몬 2021. 12. 12. 15:11

어댑터 패턴(Adapter Pattern)

 

1. 목적

  • 클래스의 인터페이스를 클라이언트가 원하는 형태의 또다른 인터페이스로 변환시켜준다.
  • 어댑터는 호환되지 않는 인터페이스 때문에 동작하지 않는 클래스들을 함께 동작할 수 있도록 만들어준다.

 

2. 역할

객체를 감싸는 역할을 한다(Object wrapping)

  • 서로호환되지 않는 두 개의 인터페이스를 연결하는 작업
  • 서로 다른 인터페이스를 동일하게 변환해준다. 

 

Ex ) 전기 플러그 

서로 다른 플러그(유럽, 미국)의 경우 어댑터를 사용해서 변환시킬 수 있다. 

어댑터 패턴의 예시

요소 설명
이름 어댑터(Adapter)
문제 사용 객체의 API가 서로 다른 문제
해결방안 함수를 변환하는 객체를 중간에 넣어준다.
결과  변경의 최소화

 

3. 문제상황

사용 객체의 API가 다른 경우(문제상황)

어댑터 패턴을 사용한 문제 상황 해결 방안. 

 

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();
    }
}