아~ 수많은 디자인 패턴중에 드디어 궁금했던 어댑터 패턴을 공부한다
곰부해보고싶은 패턴은 많은데 패턴이 느므 많자나~
Adapter Pattern?
보통 우리가 해외 여행 갈때 볼트 변환기 같은 것들을 어댑터라고 표현한다.
이같이 Adapter Pattern은 클래스의 인터페이스를 사용자가 기대하는 인터페이스 형태로 변환시키는 패턴이다.
[장점]
- 관계가 없는 인터페이스 간 같이 사용이 가능하다.
- 프로그램 검사가 용이하다.
- 클래스 재활용성이 증가한다.
[구조]
Target
- Client가 직접적으로 사용하려고 하는 인터페이스를 정의한다. (Adaptee가 지원하길 바라는 인터페이스를 의미!)
Adaptee (개조되는 역할)
- Adapter에서 사용하고자 하는 인터페이스를 정의하고 있다.
Adapter
- Target 인터페이스를 상속받아서 구현하는 클래스로 Adaptee의 함수를 사용하게 된다.
- Class Adapter - 상속을 사용한 Adaptee의 역할을 이용한다!
- Object Adapter - 위임을 사용한 Adaptee의 역할을 이용한다!
Client
- Target 인터페이스를 사용한다.
Class Adapter
- 상속
Adapter를 만들때 Target과 Adaptee의 서브클래스로 만든다.
[Class Adapter 구현]
// Adaptee
public class Banner {
private String str;
public Banner(String str) {
this.str = str;
}
public void printBanner() {
System.out.println("(" + str + ")");
}
}
// Target Interface
// Adapter가 구현해야할 인터페이스 이다.
public interface Print {
void printWeak();
void printStrong();
}
// Adapter
// Banner 클래스를 상속 받았기 때문에 인스턴스 없이 printBanner() 메소드를 사용할 수 있다구~
public class PrintBanner extends Banner implements Print{
public PrintBanner(String str) {
super(str);
}
@Override
public void printWeak() {
printBanner();
}
@Override
public void printStrong() {
System.out.println("======================");
printBanner();
System.out.println("======================");
}
}
AdapterApplication(Client) 에서 Print(Target interface) interface를 사용하여 메소드를 호출함으로써 PrintBanner(Adapter)에 요청을 한다!
AdapterApplication(Client)에서는 호출 결과를 받긴 하지만 중간에 PrintBanner(Adapter)가 껴있는지 전혀 할지 못한다.
// Client
public class AdapterApplication {
public static void main(String[] args) {
Print print = new PrintBanner("나는 리마 입니우다다다다");
System.out.println("=== Weak Banner ===");
print.printWeak();
System.out.println("=== Strong Banner ===");
print.printStrong();
}
}
[정리]
Banner 클래스의 기존 메소드를 Banner 클래스 수정 없이 변경해야할 경우 사용한다.
Object Adapter
- 위임
구성을 통해서 adaptee에 요청을 전달한다
[Object Adapter 구현]
위 Class Adapter 구현에서 PrintBanner만 손보면 된다!
상속이 아닌 인스턴스를 통해 메소드에 접근하는 방식이 차이점이다!
// Adapter
// Object Adapter일 경우
public class PrintBanner implements Print {
Banner banner;
public PrintBanner(String str) {
banner = new Banner(str);
}
@Override
public void printWeak() {
banner.printBanner();
}
@Override
public void printStrong() {
System.out.println("======================");
banner.printBanner();
System.out.println("======================");
}
}
[장단점]
장점
- 기존 코드를 변경하지 않아도 된다!
- 클래스 재활용성을 증가시킬 수 있따!
단점
- 구성요소를 위해 클래스를 증가시켜야 하기 때문에 복잡도가 증가할 수도 있음!
- Class Adapter의 경우 상속을 사용하기 때문에 유연하지 못함!
- Object Adapter의 경우 대부분의 코드를 다시 작성해야 하기 때문에 효율적이지 못함!
[사용이유]
<상황 만들기 1>
- 기존 라이브러리가 더 이상 실제 서비스와 맞지 않아 다시 만들어야하는 상황.
- 근데 이 라이브러리를 다른 부서에서도 사용하고 있음.
- 이 라이브러리를 수정할때 다른 부서에 영향을 끼치게 될 것임.
<상황 만들기 2>
- 정책이 자주 바뀌는 경우!
- 정책에 맞게 라이브러리를 계속 변경해야하는 경우!
- 기존 코드들을 건드리지 않고 변경해햐하는 경우!
이럴 경우!
Adapter Pattern을 이용하면 기존 라이브러리를 건들지 않으면서 새로운 기능을 추가 시킬 수 있을 것이다!
아~ 수고했다~ 패턴 몇개 남았더라...
오늘도 공부시켜주신 멘토님들~~~!!! 듣고 계시나요!!! 징짜징짜 감사합니다!
https://kscory.com/dev/design-pattern/adapter
https://jusungpark.tistory.com/22
https://lee1535.tistory.com/72
https://kscory.com/dev/design-pattern/adapter
https://readystory.tistory.com/125
** 그냥 하루하루 개인 공부한 것을 끄적 거리는 공간입니다.
이곳 저곳에서 구글링한 것과 강의 들은
내용이 정리가 되었습니다.
그림들은 그림밑에 출처표시를 해놓았습니다.
문제가 될시 말씀해주시면 해당 부분은 삭제 하도록하겠습니다. **
'public void static main > Etc' 카테고리의 다른 글
[Design Pattern] Decorator Pattern (0) | 2021.11.16 |
---|---|
[Design Pattern] Facade Pattern (0) | 2021.11.11 |
[Design Pattern] Builder Pattern (0) | 2021.11.09 |
[Design Pattern] Flyweight Pattern (0) | 2021.11.09 |
[Design Pattern] Observer Pattern (0) | 2021.11.07 |
댓글