Java 디자인패턴 - 어댑터(Adapter) 패턴
이번 시간에는 자바 디자인 패턴 중 빈번하게 사용되는 어댑터 패턴(Adapter Pattern)에 대해서 간단한
예제와 함께 설명 드리려 합니다.
어댑터 패턴은 한 클래스의 인터페이스를 사용하고자 하는 다른 인터페이스로 변환할 때 주로 사용하며,
이를 이용하면 인터페이스 호환성이 맞지 않아 같이 쓸 수 없는 클래스를 연관 관계로 연결해서 사용할 수 있게
해주는 패턴입니다.
아래와 같은 장점이 있습니다.
- 관계가 없는 인터페이스 간 같이 사용 가능
- 프로그램 검사 용이
- 클래스 재활용성 증가 등
아래 설명을 읽어보시고 예제 소스코드를 학습하시면 쉽게 이해하실 수 있을 거라 생각합니다.
Java 관련 포스팅 : Java 관련
Java 관련 포스팅 : Java 관련
Java 어댑터(Adapter) Pattern - 구조 설명
아래와 다이어그램으로 나타낼 수 있으며, 세부 항목은 하단에서 설명합니다.
어댑터 패턴 구조(Structure)
Java 어댑터(Adapter) Pattern - 예제 소스 코드
위에 어댑터 패턴을 적용한 7개의 파일로 구성되어 있는 MP3, MP4, MKV 확장자
재생하는
예제 소스 코드 입니다. FormatAdapter
클래스가 이번 패턴의 핵심적인 파일입니다.
어렵지 않은 내용이니 차근차근 소스코드를 분석해 보시기 바랍니다.
MediaPlayer.java
1 2 3 4 5 | public interface MediaPlayer { void play(String filename); } | cs |
MediaPackage.java
MP3.java
MP3.java
1234567 public class MP3 implements MediaPlayer{ @Override public void play(String filename) { System.out.println("Playing MP3 File " + filename); }}
cs
1 2 3 4 5 6 7 | public class MP3 implements MediaPlayer{ @Override public void play(String filename) { System.out.println("Playing MP3 File " + filename); } } | cs |
MP4.java
1234567 public class MP4 implements MediaPackage{ @Override public void playFile(String filename) { System.out.println("Playing MP4 File " + filename); }}
cs
1 2 3 4 5 6 7 | public class MP4 implements MediaPackage{ @Override public void playFile(String filename) { System.out.println("Playing MP4 File " + filename); } } | cs |
MKV.java
MKV.java
1234567 public class MKV implements MediaPackage{ @Override public void playFile(String filename) { System.out.println("Playing MKV File " + filename); }}
cs
1 2 3 4 5 6 7 | public class MKV implements MediaPackage{ @Override public void playFile(String filename) { System.out.println("Playing MKV File " + filename); } } | cs |
FormatAdapter.java
FormatAdapter.java
123456789101112131415 public class FormatAdapter implements MediaPlayer { private MediaPackage media; public FormatAdapter(MediaPackage m) { media = m; } @Override public void play(String filename) { System.out.print("Using Adapter --> "); media.playFile(filename); } }
cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class FormatAdapter implements MediaPlayer { private MediaPackage media; public FormatAdapter(MediaPackage m) { media = m; } @Override public void play(String filename) { System.out.print("Using Adapter --> "); media.playFile(filename); } } | cs |
Main.java
Main.java
1234567891011121314 public class Main { public static void main(String[] args) { MediaPlayer player = new MP3(); player.play("file.mp3"); player = new FormatAdapter(new MP4()); player.play("file.mp4"); player = new FormatAdapter(new MKV()); player.play("file.mkv"); }}
cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class Main { public static void main(String[] args) { MediaPlayer player = new MP3(); player.play("file.mp3"); player = new FormatAdapter(new MP4()); player.play("file.mp4"); player = new FormatAdapter(new MKV()); player.play("file.mkv"); } } | cs |
Java Design Pattern 의 QuickGuide 및 추가 정보는 이 곳을 참고해 주세요.
Java Design Pattern 의 QuickGuide 및 추가 정보는 이 곳을 참고해 주세요.
Java 어댑터(Adapter) Pattern - 클래스 다이어그램(UML) 및 예제 실행
위의 예제는 아래와 같은 클래스 다이어그램으로 표현 가능합니다.
Class Diagram
소스 코드 작성 후 실행하시면 아래와 같이 동작하는 화면을 확인하실 수 있습니다.
실제 실행 화면
마무리
어댑터 패턴이 주는 이점은 실무 개발을 진행 하는 중에 상당히 많다는 것을 느끼고 있습니다.
어댑터 패턴은 기존 클래스의 소스코드를 수정해서 인터페이스에 맞추는 작업보다는 기존 클래스의
소스코드의 수정을 전혀 하지 않고 타겟 인터페이스에 맞춰서 동작을 가능하게 합니다.
즉, 기존 클래스의 명세(사양)만 알면 얼마든지 새로운 클래스도 작성할 수 있는 것입니다.
이를 통해 소스코드가 간단해지고 유지보수도 원할하게 하는 이점도 있겠지요?
이어지는 포스팅에서는 자바 템플릿 메소드 패턴(Template Method Pattern)에 대해 설명하겠습니다.
감사합니다.
소스코드 다운로드 : adapter-pattern.zip
'언어 > Java' 카테고리의 다른 글
Java(자바) 디자인패턴 - 팩토리(Factory Method) 패턴 설명 및 예제소스 (7) | 2018.05.21 |
---|---|
Java(자바) 디자인패턴 - 템플릿 메소드(Template Method) 패턴 설명 및 예제소스 (1) | 2018.05.18 |
Java(자바) 디자인패턴 - 전략(Strategy) 패턴 설명 및 예제소스 (3) | 2018.04.18 |
Java(자바) Runtime - 외부 프로세스(exec) 실행 예제 소스 (3) | 2017.12.29 |
Java(자바) BlockingQueue - Producer 및 Consumer 패턴 예제 (0) | 2017.12.27 |