티스토리 뷰
어댑터 패턴 (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
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 |