-
구조패턴 > 어댑터 *기타/디자인패턴 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); } }
* 데코레이터와 어댑터
데코레이터 : 기존 객체를 감싸면서 기존 코드의 수정없이 클래스에 새로운 행동을 추가할 수 있다.
어댑터 : 객체를 감싸 인터페이스를 변환한다. 기존 코드를 코드의 수정없이 새로운 라이브러리를 쓸 수 있다.
반응형'기타 > 디자인패턴' 카테고리의 다른 글
행위패턴 > 이터레이터 * (0) 2021.02.11 행위패턴 > 커맨드 * (0) 2021.02.11 구조패턴 > 퍼싸드 * (0) 2021.02.11 구조패턴 > 데코레이터 * (0) 2021.02.11 구조패턴 > 컴포지트 * (0) 2021.02.11