adapter의 의미는 '접속 소켓', '확장 카드', '(물건을 다른 것에) 맞추어 붙이다', '맞추다'이다. 그림처럼 전원에서 나오는 전기는 대개 교류 200V이지만 노트북은 직류 120V이다. 그러나 우리는 노트북을 사용할 때 아무런 불편 없이 노트북 선을 전원에 그대로 꽃아 사용한다. 이는 중간에 교류 200V를 직류 120V로 바꾸어 주는 무엇인가가 존재하기 때문이다. 이것이 노트북 선 중간에 붙어 있는 어댑터이다.

 

 

  1. 클래스 adapter 패턴 : 상속을 이용한 어댑터 패턴
  2. 인스턴스 adapter 패턴 : 구성(위임)을 이용한 어댑터 패턴

그림에서 client target 인터페이스를 사용하여 메서드를 호출한다. adapter에서는 adaptee 인터페이스를 사용하여 concreteMethod 호출로 변경한다. 이때 client는 중간에 adapter가 존재한다는 것을 인식하지 못한다.

 

<클래스 Adapter 패턴>

<인스턴스(객체) Adapter 패턴>

 

클래스 어댑터 패턴은 다중 상속을 허용하는 프로그래밍 언어에서만 가능한 패턴이다.

 

콘센트를 예를 들어 사용해보자. 우리나라는 기본적으로 220V 플러그인을 사용하는 나라이다. 하지만 외국은 대부분 110V를 사용하는 나라가 많기 때문에 중간에 어댑터를 이용하여 사용한다. 이것을 객체로 디자인하여 사용해보자.

 

인스턴스(객체) 어댑터 패턴

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public interface Plugin {
    
    public void connect();
    public void disconnect();
    
}
 
public class Plugin_220V implements Plugin {
    @Override
    public void connect() {
        System.out.println("220V connect");
    }
    @Override
    public void disconnect() {
        System.out.println("220V disconnect");
    }
}
 
public interface PluginAdapter {
    public void connect();
    public void disconnect();
}
 
public class Adapter_110V implements PluginAdapter {
    
    private Plugin plugin;
    
    public Adapter_110V(Plugin plugin) {
        this.plugin=plugin;
    }
    @Override
    public void connect() {
        System.out.println("110V->220V convert");
        this.plugin.connect();
    }
    @Override
    public void disconnect() {
        System.out.println("110V->220V convert");
        this.plugin.disconnect();
    }
}
 
public class AdapterMain {
    public static void main(String[] args) {
        PluginAdapter plugin = new Adapter_110V(new Plugin_220V());
        plugin.connect();
        plugin.disconnect();
    }
}
=>result
110V->220V convert
220V connect
110V->220V convert
220V disconnect
 
cs

 

객체 어댑터 패턴은 위와 같이 구성을 이용하여 어댑터 클래스를 구성한다. 클라이언트는 어댑터 인터페이스로만 의존하고 실제적인 어댑티는 알지 못한다.

posted by 여성게
: