본문 바로가기

디자인패턴

[디자인패턴] 어댑터 패턴(Adaptor Parttern)

정의

어댑터 패턴은 클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴으로, 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 해준다.

Adaptor Pattern UML

 

우리나라와 다른 콘센트나 전압(220V)을 쓰는 외국에 가면 그 나라의 콘센트와 전압(110V)을 사용할 수 있게 해주는 어댑터를 볼 수 있다. 어댑터란 형식이 다른 둘 사이에 연결되서 이 둘이 호환될 수 있도록 해주는 도구이다. 객체지향에서 어댑터는 보통 인터페이스가 다른 서로 다른 객체들이 같은 형식 아래 자동할 수 있도록 하는 역할을 한다.

 

 

예시)

양식 자격증을 가진 요리사는 '요리'를 하고 파티셰 자격증을 가진 파티셰는 '제과'를 한다

많은 요리사들이 일하는 식당에서 디저트 메뉴를 제공하기 위해 파티셰를 고용했다.

매니저는 바쁜 와중에 누구한테는 '요리' 해라. 누구한테는 '제과'해라 구분해서 말할 정신이 없다.

그래서 파티셰에게 어댑터를 달어주는것이다. 파티셰님은 앞으로 제가 '요리' 하세요 하면 '제과'를 하시면 됩니다.

 

 

 

 

 

예시2)

사이트가 다른 서비스와 연결 되면서, 동영상을 검색하는 옵션도 가져오게되었다. 그런데 이 검색 방식을 다른 회사에서 짠거라서 기존 쓰던것과는 인터페이스가 다르다. 인터페이스 뿐만 아니라, 메소드명도 다르고 메소드 형식도 다르다.(메소드 실행 시 입력받는 매개변수)

 

 

기존 검색 전략
public interface SearchStrategy {
    public void search();
}

class SearchStrategyAll implements SearchStrategy {
    @Override
    public void search() {
        System.out.println("SEARCH ALL");
        // 전체검색하는 코드
    }
}

class SearchStrategyImage implements SearchStrategy {
    @Override
    public void search() {
        System.out.println("SEARCH IMAGE");
        // 이미지검색하는 코드
    }
}

class SearchStrategyNews implements SearchStrategy {
    @Override
    public void search() {
        System.out.println("SEARCH NEWS");
        // 뉴스검색하는 코드
    }
}

class SearchStrategyMap implements SearchStrategy {
    @Override
    public void search() {
        System.out.println("SEARCH MAP");
        // 지도검색하는 코드
    }
}

 

public class SearchButton {
    private MyProgram myProgram;

    public SearchButton(MyProgram _myProgram) {
        myProgram = _myProgram;
    }

    private  SearchStrategy searchStrategy = new SearchStrategyAll();

    public void setSearchStrategy(SearchStrategy _searchStrategy) {
        searchStrategy = _searchStrategy;
    }

    public void onClick() {
        searchStrategy.search();
    }
}

 

다른 회사의 검색전략
public interface FindAlgorithm {
    public void find(boolean global);
}

class FindVideoAlgorithm implements FindAlgorithm {
    @Override
    public void find(boolean global) {
        System.out.println("find video" + (global ? " globally" : ""));
    }
    // 동영상검색하는 코드
    // ...
    // ...
}

 

다른 회사의 검색전략 기존회사 인터페이스에 맞게 어댑터 연결
public class SearchFindAdapter implements SearchStrategy {
    private FindAlgorithm findAlgorithm;

    public SearchFindAdapter (FindAlgorithm _findAlgorithm) {
        findAlgorithm = _findAlgorithm;
    }

    @Override
    public void search() {
        findAlgorithm.find(true);
    }
}

 

public class MyProgram {
    private SearchButton searchButton = new SearchButton(this);

    public void setModeAll() {
        searchButton.setSearchStrategy(new SearchStrategyAll());
    }
    public void setModeImage() {
        searchButton.setSearchStrategy(new SearchStrategyImage());
    }
    public void setModeNews() {
        searchButton.setSearchStrategy(new SearchStrategyNews());
    }
    public void setModeMap() {
        searchButton.setSearchStrategy(new SearchStrategyMap());
    }
    public void setModeVideo() {
        searchButton.setSearchStrategy(new SearchFindAdapter(new FindVideoAlgorithm()));
    }

    public void testProgram() {
        searchButton.onClick();

        setModeImage();
        searchButton.onClick();

        setModeNews();
        searchButton.onClick();

        setModeMap();
        searchButton.onClick();

        setModeVideo();
        searchButton.onClick();
    }
}

 

메인함수
public class AdapterExample {
    public static void main(String[] args) {
        MyProgram myProgram = new MyProgram();

        myProgram.testProgram();
    }
}

 

 

 

실행결과

 

 

 

 

 

 

 

 

참조

https://jusungpark.tistory.com/22 

https://www.youtube.com/watch?v=q3_WXP9pPUQ&t=17s