오늘 하루도 끝나가네요-_-
시간은 왜 이리도 빠른지
도전해 보고 싶은 것은 많은데
나이만 먹는거 같네요ㅜㅜ
아무튼 오늘은 지난 시간에 이어서
디자인 패턴 중 어댑터 패턴에 대해 학습하겠습니다
지난 학습 Iterator 패턴이 궁금하시다면
아래의 링크를 Click!
2020/06/08 - [Java] - [Design Pattern] 반복자 패턴(Iterator Pattern)
우리가 흔히 아는 어댑터는
교류 100볼트를 직류 12볼트로
교환해주는 AC 어댑터일 것입니다
어댑터 패턴도 이와 비슷한데
"이미 제공되어 있는 것"과
"필요한 것" 사이를 이어주는 것입니다
Wrapper 패턴이라고 부르기도 하는데요
어댑터 패턴은 클래스(상속)를 사용한 것과
인스턴스(위임)를 사용한 것이 있습니다
아래의 표는 어댑터 패턴을 구성하는
역할을 정리한 것입니다
역할 | 설명 |
대상(Target) | 지금 필요한 메소드를 결정 |
의뢰자(Client) | 대상(Target) 역할의 메소드를 사용 |
개조되는 쪽(Adaptee) | 이미 준비되어 있는 메소드를 가지고 있는 역할 |
개조하는 쪽(Adapter) | 개조되는 쪽(Adaptee) 역할의 메소드를 사용해서 어떻게든 대상(Target) 역할을 만족시킴 |
역시 글보다는 코드를 작성해보고
테스트해보는 것이 직관적이겠죠-_-
먼저 클래스(상속)를 사용한 어댑터 패턴을 보겠습니다
1. 클래스(Class) Banner.java
package AdapterPattern.Inheritance; public class Banner { private String string; public Banner(String string) { this.string = string; } public void showWithParen() { System.out.println("(" + string + ")"); } public void showWithAster() { System.out.println("*" + string + "*"); } }
2. 인터페이스(Interface) Print.java
package AdapterPattern.Inheritance; public interface Print { public abstract void printWeak(); public abstract void printString(); }
3. 클래스(Class) PrintBanner.java
package AdapterPattern.Inheritance; public class PrintBanner extends Banner implements Print { public PrintBanner(String string) { super(string); } public void printWeak() { showWithParen(); } public void printString() { showWithAster(); } }
4. 클래스(Class) Test.java
import AdapterPattern.Inheritance.*; public class Test { public static void main(String[] args) { /* Adapter */ Print p = new PrintBanner("Hello"); p.printWeak(); p.printString(); } }
위의 코드에서 Banner 클래스는
미리 제공되어 있는 클래스이고
우리가 필요한 것이
인터페이스 Print라고 한다면
PrintBanner 클래스가
어댑터의 역할을 수행합니다
이번엔 인스턴스(위임)에 의한
어댑터 패턴을 보겠습니다
Banner 클래스는 동일하고
우리가 필요로 하는 것이 인터페이스가 아니라
추상 클래스 Print라면 어떻게 될까요?
자바에서는 이중 상속이 불가능합니다
따라서 PrintBanner 클래스를 약간 수정해야합니다
5. 클래스(Class) Print.java
package AdapterPattern.Mandate; public abstract class Print { public abstract void printWeak(); public abstract void printString(); }
6. 클래스(Class) 변경된 PrintBanner.java
package AdapterPattern.Mandate; public class PrintBanner extends Print { private Banner banner; public PrintBanner(String string) { this.banner = new Banner(string); } public void printWeak() { banner.showWithParen(); } public void printString() { banner.showWithAster(); } }
7. 클래스(Class) Banner.java
package AdapterPattern.Mandate; public class Banner { private String string; public Banner(String string) { this.string = string; } public void showWithParen() { System.out.println("(" + string + ")"); } public void showWithAster() { System.out.println("*" + string + "*"); } }
위의 코드를 보시면
단일 상속을 해야하기 때문에
Banner 클래스를 PrintBanner 클래스 내부에서
인스턴스를 생성하고 있다는 점이
이전 코드와 다른 점입니다
마찬가지로 Test 클래스를 실행시켜보면
결과는 동일합니다
이 패턴은 언제 유용할까요?
먼저 이미 검증이 끝난 클래스를
수정하지 않아도된다는 점입니다
검증이 끝난 클래스를 기능에 맞게
다시 작성하는 일은 정말...
다시 테스트...
생각도 하기 싫네요
다른 경우도 비슷한데
신 버전이 나와서
구 버전과의 호환성을 생각할 때가 있겠습니다
이 경우에는 신 버전이 Adaptee
구 버전이 Target이 되며
Adapter 역할을 수행할 클래스를 새로이 생성!!
지금까지 어댑터 패턴에 대해 학습했습니다
누군가가 디자인 패턴 이야기를 하는데
금방 생각이 나지 않아서 복습겸 학습하는데
시간만 많으면 하루 종일도 하겠네요
일할 때는 그렇게 하기 싫더니...
헛소리는 그만하고
오늘의 학습을 마치도록 하겠습니다
그럼 이만-_- 굿 밤
'Java' 카테고리의 다른 글
[Design Pattern] 빌더 패턴(Builder Pattern) (0) | 2020.06.15 |
---|---|
[Design Pattern] 싱글톤(Singleton) 패턴과 프로토타입(Prototype) 패턴 (0) | 2020.06.14 |
[Design Pattern] 팩토리 메소드 패턴(Factory Method Pattern) (0) | 2020.06.13 |
[Design Pattern] 템플릿 메소드 패턴(Template Method Pattern) (0) | 2020.06.11 |
[Design Pattern] 반복자 패턴(Iterator Pattern) (0) | 2020.06.08 |