티스토리 뷰

반응형

어댑터 패턴 (Adapter Pattern)

 

어댑터는 변환기로, 서로 다른 두 인터페이스 사이에 통신이 가능하게 합니다.

프로그램에서 어댑터 패턴 디자인이란 한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 인터페이스로 변환하고자 할때 사용합니다.

 

 

문제

 

A라는 사람이 B파서를 통해 HTML 문서를 파싱하는 어플리케이션을 만들었습니다. 그러던중 B파서 말고도 다른 종류의 문서도 파싱 할 수 있는 C파서도 필요하게 되었습니다. 살펴보니 C파서와 B파서가 제공하는 인터페이스는 약간의 차이가 있습니다. 이러한 상황에 대해 Adapter Pattern을 적용하여 문제를 해결 해보겠습니다.

 

 

B파서만 사용하는 기존코드

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Parser_B {
    
    private String st;
    
    public Parser_B(String st)
    {
        this.st = st;
    }
    
    public void Parsing()
    {
        System.out.println(st+"의 내용을 "+"B파서를 이용하여 파싱!!");
    }
 
}

 

기존에 사용하던 Parser_B의 구현내용입니다.  Parsing()메서드를 통해 파싱을 실시합니다. 실제 메인(사용자)는 다음과 같이 사용하게 됩니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
public class Main {
    
    public static void main(String argsp[])
    {    
        String content = "hello";
        Parser_B parser = new Parser_B(content);
        parser.Parsing();
        
    }
 
}
 

사용자는 B파서객체.Parsing()을 통해 파싱을 실시합니다.

여기서 추가 된 C 파서를 살펴 보겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Parser_C {
    
    private String st;
    
    public Parser_C(String st)
    {
        this.st = st;
    }
    
    public void C_Parsing()
    {
        System.out.println(st+"의 내용을 "+"C파서를 이용하여 파싱!!");
    }
 
}

C파서는 B파서와 동일하지만 다른 부분이 존재합니다. 파싱 기능을 실제로 제공하는 메서드의 이름이 다르다는 것입니다. 사용자 입장에서는 B파서이든 C파서이든 똑같은 이름으로 파싱기능을 하는 메서드를 호출하고 싶은데 말입니다.

 

 

해결 방법

 

먼저 B,C 파서가 공통적으로 구현해야 할 인터페이스를 정의해줍니다.  

 

1
2
3
4
public interface Parser {
    public void Do_Parsing();
}
 

 

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Adapter_B_Parser implements Parser {
    
    Parser_B b_parser;
    
    public Adapter_B_Parser(Parser_B b_parser)
    {
        this.b_parser = b_parser;
    }
    
    public void Do_Parsing()
    {
        b_parser.Parsing();
    }
    
}
 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Adapter_C_Parser {
    
    Parser_C c_parser;
    
    public Adapter_C_Parser(Parser_C c_parser)
    {
        this.c_parser = c_parser;
    }
    
    public void Do_Parsing()
    {
        c_parser.C_Parsing();
    }
 
}

Parser 인터페이스를 상속받아 구현합니다. 각각의 어댑터는 B,C파서의 객체를 가지고 두 클래스의 공통 인터페이스에 속하는 Do_Parsing()을 통해서 각각의 파싱 메서드를 호출하고 있습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Main {
    
    public static void main(String argsp[])
    {    
        String st = "hello";
        
        Adapter_B_Parser parser1 = new Adapter_B_Parser(new Parser_B(st));
        Adapter_C_Parser parser2 = new Adapter_C_Parser(new Parser_C(st));
        
        parser1.Do_Parsing();
        
        parser2.Do_Parsing();
        
    }
 
}

실제로 사용자(메인)에서 어뎁터 패턴을 적용하여 B와 C파서를 호출합니다.

분명 두 개의 파서는 파싱 기능을 하는 메서드 호출 인터페이스 방식이 달랐는데 반면에 이제는 Do_Parsing()을 통해 똑같은 방식으로 호출을 하고 있습니다.

 

 

반응형

'Study > 디자인 패턴' 카테고리의 다른 글

07 브릿지 패턴 (Bridge Pattern)  (0) 2017.09.22
06 프록시 패턴 (Proxy Pattern)  (0) 2017.09.21
04 Builder 패턴  (0) 2017.09.14
03 Template Method 패턴  (2) 2017.09.10
02 Singleton 패턴  (0) 2017.09.09