Adapter Pattern
디자인 패턴이란?
디자인 패턴이란?
- 디자인 패턴은 소프트웨어 공학의 소프트웨어 설계에서 공통으로 발생하는 문제를 자주 쓰이는 설계 방법을 정리한 패턴이다.
- 디자인 패턴을 참고하여 개발하면 효율성과 유지보수성, 운용성이 높아지며, 프로그램 최적화가 된다고 한다.
디자인 패턴을 목적과 범위로 나눌수 있다
구분 | 유형 | 설명 |
---|---|---|
생성 | 객체 인스턴스 생성에 관여, 클래스 정의와 객체 생성 방식을 구조화, 캡슐화를 수행 | |
목적 | 구조 | 더 큰 구조 형성 목적으로 클래스나 객체의 조합을 다루는 패턴 |
행위 | 클래스나 객체들이 상호작용하는 방법과 역할 분담을 다루는 패턴 | |
범위 | 클래스 | 클래스간 관련성(상속), 컴파일 시 정적으로 결정 |
객체 | 객체 간 관련성을 다루는 패턴, 런타임 시 동적으로 결정 |
기존의 시스템에 새로운 써드파티 라이브러리를 추가하거나 레거시 인터페이스를 새로운 인터페이스로 교체하는 경우 다른 인터페이스를 자신의 인터페이스 스타일로 변경하겠다.
Facade 패턴과의 차이: 복잡한 기능을 중간에서 감추고 심플하게 단방향 통신하겠다
어댑터 패턴이란?
우리가 해외여행을 가면 220V를 110V에 바로 전기를 꼽지못하지만 사용할 수 있도록 도와주는 친구가 어댑터다.
이 개념을 똑같이 코드에 가져가서 생각하면된다.
상황
Client는 Target 인터페이스를 구현한 Adaptee가 필요하다.
Adaptee는 Target인터페이스를 구현하지 않고 있다.
Adaptee는 이미 개발이 완료되어 사용중이다.
Adaptee를 변경하는 것이 적절하지 않은 상황이다.
1
2
3
4
5
6
7
8
9
10
// Adaptee는 이미 개발이 완료되어 사용중이고 변경하는 것이 적절하지 않음.
public interface Plugin {
public void connect();
}
public class Plugin220V implements Plugin {
@Override
public void connect() {
System.out.println("220V");
}
해결 방법 (많은 사람들이 사용하는 방식인 Object Adapter 방식으로 구현)
대부분의 코드를 구현해야하지만 Composition
을 사용하기에 유연함으로 많은사람이 채택함.
Adapter
1
2
3
4
// 어뎁터 클래스를 만든다.
public interface PluginAdapter {
public void connect();
}
client
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Adapter110V implements PluginAdapter {
private Plugin plugin;
public Adapter110V(Plugin plugin) {
this.plugin=plugin;
}
@Override
public void connect() {
System.out.println("110v convert");
this.plugin.connect();
}
//main
public class AdapterPattern {
public static void main(String[] args) {
PluginAdapter plugin = new Adapter110V(new Plugin220V());
plugin.connect();
}
}
기존에 생성된 클래스를 재사용할 수 있도록 중간에서 맞춰주는 역할을 하는 인터페이스를 만드는 패턴으로써
상속을 이용
하는 클래스 패턴과 위임을 이용
하는 인스턴스 패턴의 두 가지 형태로 사용되는 디자인 패턴이다.
인터페이스가 호환되지 않는 클래스들을 함께 이용할 수 있도록 다른 클래스의 인터페이스를 기존 인터페이스에 덧씌운다.
Class 어댑터
에서는 어댑터를 만들 때 타겟과 어댑티 모두의 서브 클래스로 만들고,
Object 어댑터
에서는 구성을 통해서 어댑티에 요청을 전달한다는 점을 제외하면 별다른 차이점이 없다
결론
변경할 수 없는 내부 구현, 라이브러리 등에 추가적인 기능을 만들고 싶을 때 유용하게 활용할 수 있다. 사용해야하는 인터페이스가 현재의 시스템과 호환되지 않는다고 해서 굳이 현존하는 시스템을 호환되도록 변경할 필요는 없다.
참고자료
Source Ⅰ
Head First 디자인패턴
면접을 위한 CS 전공지식노트