Updated:

1. 개요

클래스의 인터페이스를 사용자가 원하는 다른 인터페이스로 변환해주는 패턴

적응자 패턴(Adapter Pattern)은 구조 패턴(Structural Pattern)의 한 종류로, 기존의 인터페이스를 사용자가 원하는 다른 인터페이스로 변환하여, 호환성 문제 때문에 함께 동작할 수 없는 클래스들을 함께 동작할 수 있도록 하는 패턴이다.

2. 구조 패턴(Structural Pattern)

2-1. 구조 패턴이란?

구조 패턴이란 작은 클래스들의 상속과 합성을 통해 더 큰 클래스를 생성하는 방법을 제공하는 패턴으로, 독립적으로 개발한 클래스들을 마치 하나인 것 처럼 사용할 수 있다.

2-2. 구조 패턴 종류

3. 구성

[Class Adapter]

[출처 : GoF의 디자인 패턴]

[Object Adapter]

[출처 : GoF의 디자인 패턴]

  • Target : 기준이 되는 클래스

  • Client : Target 클래스를 사용하는 주체

  • Adaptee : Adapter를 적용하여 Target 클래스로 변환되는 클래스

  • Adapter : Adaptee 클래스를 Target 클래스로 변환시켜주는 클래스

4. 예제 코드

삼성 제품을 연결하는 삼성용 멀티탭과 LG 제품을 연결하는 LG용 멀티탭이 있다고 가정해보자. 각각 멀티탭의 규격이 다르므로, 삼성 제품을 LG용 멀티탭에 연결하기 위해서는 Adapter를 이용해야 한다.

4-1. Target

[LgMultitap.java]

1
2
3
4
5
public interface LgMultitap {
    
    void lgConnect();
    void lgDisconnect();
}

4-2. Adaptee

[SamsungMultitap.java]

1
2
3
4
5
public interface SamsungMultitap {

    void samsungConnect();
    void samsungDisconnect();
}

[SamsungFan.java]

1
2
3
4
5
6
7
8
9
10
11
12
public class SamsungFan implements SamsungMultitap {
    
    @Override
    public void samsungConnect() {
        System.out.println("삼성 선풍기 연결");
    }

    @Override
    public void samsungDisconnect() {
        System.out.println("삼성 선풍기 연결해제");
    }
}

4-3. Adapter

[SamsungToLgAdapter.java]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class SamsungToLgAdapter implements LgMultitap {

    private final SamsungMultitap samsungMultitap;

    public SamsungToLgAdapter(SamsungMultitap samsungMultitap) {
        this.samsungMultitap = samsungMultitap;
    }

    @Override
    public void lgConnect() {
        System.out.println("Use Adapter");
        samsungMultitap.samsungConnect();
    }

    @Override
    public void lgDisconnect() {
        System.out.println("Use Adapter");
        samsungMultitap.samsungDisconnect();
    }
}

5. 테스트

[Clinet.java]

1
2
3
4
5
6
7
8
9
10
public class Client {

    public static void main(String[] args) {
        SamsungFan samsungFan = new SamsungFan();

        LgMultitap lgMultitap = new SamsungToLgAdapter(samsungFan);
        lgMultitap.lgConnect();
        lgMultitap.lgDisconnect();
    }
}

[실행 결과]

6. 특징

  • 클래스 재사용성 증가 : 기존 코드를 변경하지 않아도 되므로 클래스의 재사용성 증가

  • 코드의 양 증가 : Adapter 클래스는 상속받은 클래스의 메서드를 다시 구현해야 하므로 코드의 양 증가

7. Adapter vs Bridge

  • Adapter Pattern

    • 이미 존재하는 두 인터페이스 간의 불일치 해결

    • 인터페이스의 구현 방법 등은 고려하지 않음

    • 설계가 완료된 후 호환되지 않은 부분에 적용

  • Bridge Pattern

    • 정의와 구현을 따로 만들어서 연결

    • 새로운 구현의 추가 가능

    • 설계가 완료되기 전 추상과 개념을 각각 독립적으로 확장 가능

Updated:

Leave a comment