기타/디자인패턴
구조패턴 > 어댑터 *
ssseung
2021. 2. 11. 10:09
다른 인터페이스로 변환, 호환성
한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환한다.
어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 사용할 수 있다.
* mp3 (MediaPlayer)는 play 를, 새로 나온 mp4(MediaPackage)는 playFile 메서드를 각각 가지고 있는데
mp4가 mp3 의 play 를 사용할 수 있도록 하려면?
mp3 를 상속하는 adapter 객체를 만들고 adapter 가 mp4를 구성요소로 가지게 한다.
adapter 의 play 를 호출할 때 mp4의 playfile 이 호출되도록 한다.
이전에 사용하던 play에 변화를 주지 않고 새로 나온 mp4의 기능을 호출할 수 있다.
public class Main {
public static void main(String[] args) {
//MP4를 생성하는데, 어댑터의 타깃은 MediaPlayer(MP3)
MediaPlayer player = new FormatAdapter(new MP4());
//MP3 의 play 를 호출하는데 내부적으로 mp4의 playfile 을 호출
player.play("file.mp4");
}
}
MediaPlayer - MP3
public interface MediaPlayer {
public void play(String filename);
}
public class MP3 implements MediaPlayer{
@Override
public void play(String filename) {
System.out.println("playing MP3 file " + filename);
}
}
MediaPackage - MP4
public interface MediaPackage {
void playFile(String filename);
}
public class MP4 implements MediaPackage{
@Override
public void playFile(String filename) {
System.out.println("playing MP4 file " + filename);
}
}
Adapter
MediaPlayer(MP3) 의 play 내에서 MediaPackage(MP4) 의 playfile 을 호출
public class FormatAdapter implements MediaPlayer{
private MediaPackage media;
public FormatAdapter(MediaPackage media) {
this.media = media;
}
@Override
public void play(String filename) {
System.out.println("using Adapter" + filename);
media.playFile(filename);
}
}
* 데코레이터와 어댑터
데코레이터 : 기존 객체를 감싸면서 기존 코드의 수정없이 클래스에 새로운 행동을 추가할 수 있다.
어댑터 : 객체를 감싸 인터페이스를 변환한다. 기존 코드를 코드의 수정없이 새로운 라이브러리를 쓸 수 있다.
반응형