호환되지 않는 인터페이스를 적응시켜 사용가능하도록 하는 방법이다.
이게 무슨 소린가 한참 생각해 봤는데 그러는 것보다 직접 코드 쳐서 이해하는게 빠르다는 것을 꺠달았다.
주목해야할 특징
- Adapter 클래스는 클라이언트가 사용할 타입을 상속한다.
- 멤버변수로 적응시킬 인터페이스를 선언한다.
- Adapter 가 상속한 타입을 재정의하는 과정에서 멤버변수의 메서드를 호출한다.
- 결국 , 클라이언트가 원하는 인터페이스를 호출할 수 있지만, 기능은 적응시킬 인터페이스의 기능이 호출된다.
FormatAdapter 가 MediaPlayer 로 프로모션 되어 사용되어질 수 있으며, 내부 메서드 호출은 MediaPackage 의 기능으로 호출된다.
public interface MediaPlayer {
void play(String fileName);
}
public class MP3 implements MediaPlayer {
@Override
public void play(String fileName) {
System.out.println("Playing MP3 : "+fileName);
}
}
//MediaPackage
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
public class FormatAdapter implements MediaPlayer {
private MediaPackage mediaPackage;
public MediaPackage getMediaPackage() {
return mediaPackage;
}
public FormatAdapter(MediaPackage mediaPackage) {
this.mediaPackage = mediaPackage;
}
@Override
public void play(String fileName) {
System.out.print("Using Adapter ---> ");
mediaPackage.playFile(fileName);
}
}
//호출되는 메인 메서드
public class Main {
public static void main(String[] args) {
MediaPlayer mp3 = new MP3();
mp3.play("벚꽃엔딩.mp3");
MediaPackage mp4 = new MP4();
mp4.playFile("흔들리는 꽃들 속에서 너의 샴푸향이 느껴진거야.mp4");
// mp4 -> mp3
// 구현으로 인하여 MediaPlayer 를 쓰고 있으나 사용하는 것은 MediaPackage 이다.
// Client 에서 MediaPlayer Type 을 호출한다고해도 MediaPackage 의 기능을 사용할 수 있게 된다.
MediaPlayer formatAdapter = new FormatAdapter(new MP4());
formatAdapter.play("당신과는 천천히.mp4");
}
}
//로깅
Playing MP3 : 벚꽃엔딩.mp3
Playing MP4 File : 흔들리는 꽃들 속에서 너의 샴푸향이 느껴진거야.mp4
Using Adapter ---> Playing MP4 File : 당신과는 천천히.mp4
'Design Pattern' 카테고리의 다른 글
Prototype (0) | 2020.11.29 |
---|---|
SingleTon Pattern (0) | 2020.11.24 |
Factory Method (0) | 2020.11.24 |
Template Method (0) | 2020.11.23 |
Strategy (0) | 2020.11.23 |