기타/디자인패턴

구조패턴 > 어댑터 *

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);
	}
}

 

* 데코레이터와 어댑터

데코레이터 : 기존 객체를 감싸면서 기존 코드의 수정없이 클래스에 새로운 행동을 추가할 수 있다. 

어댑터 : 객체를 감싸 인터페이스를 변환한다. 기존 코드를 코드의 수정없이 새로운 라이브러리를 쓸 수 있다. 

 

반응형