Java

[Design Pattern] 어댑터 패턴(Adapter Pattern)

구루싸 2020. 6. 9. 22:47
반응형
SMALL

오늘 하루도 끝나가네요-_-

시간은 왜 이리도 빠른지

도전해 보고 싶은 것은 많은데

나이만 먹는거 같네요ㅜㅜ

아무튼 오늘은 지난 시간에 이어서

디자인 패턴 중 어댑터 패턴에 대해 학습하겠습니다

지난 학습 Iterator 패턴이 궁금하시다면

아래의 링크를 Click!

2020/06/08 - [Java] - [Design Pattern] 반복자 패턴(Iterator Pattern)

[Design Pattern] 반복자 패턴(Iterator Pattern)

아직 6월 초인데 한 여름 마냥 날씨가 급격하게 더워져서 출퇴근 길에 땀이 흥건...하... 30도 가까이 되는 지역도 있더라고요 코로나19도 끝날 기미가 보이지 않는데 몸 관리 잘하시길 바랍니다 ��

yssa.tistory.com

우리가 흔히 아는 어댑터는

교류 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 역할을 수행할 클래스를 새로이 생성!!
지금까지 어댑터 패턴에 대해 학습했습니다
누군가가 디자인 패턴 이야기를 하는데
금방 생각이 나지 않아서 복습겸 학습하는데
시간만 많으면 하루 종일도 하겠네요
일할 때는 그렇게 하기 싫더니...
헛소리는 그만하고

오늘의 학습을 마치도록 하겠습니다

그럼 이만-_- 굿 밤

 

 

반응형
LIST