본문 바로가기
public void static main()/Design Pattern

[Design Pattern] Adapter Pattern

by 햄리뮤 2021. 11. 10.
반응형

아~ 수많은 디자인 패턴중에 드디어 궁금했던 어댑터 패턴을 공부한다 

곰부해보고싶은 패턴은 많은데 패턴이 느므 많자나~

 

https://refactoring.guru/design-patterns/adapter

Adapter Pattern?

보통 우리가 해외 여행 갈때 볼트 변환기 같은 것들을 어댑터라고 표현한다.

이같이 Adapter Pattern은 클래스의 인터페이스를 사용자가 기대하는 인터페이스 형태로 변환시키는 패턴이다.

 

[장점]

  • 관계가 없는 인터페이스 간 같이 사용이 가능하다.
  • 프로그램 검사가 용이하다.
  • 클래스 재활용성이 증가한다.

https://refactoring.guru/design-patterns/adapter

[구조]

Target

  • Client가 직접적으로 사용하려고 하는 인터페이스를 정의한다. (Adaptee가 지원하길 바라는 인터페이스를 의미!)

Adaptee (개조되는 역할)

  • Adapter에서 사용하고자 하는 인터페이스를 정의하고 있다.

Adapter

  • Target 인터페이스를 상속받아서 구현하는 클래스로 Adaptee의 함수를 사용하게 된다.
  • Class Adapter - 상속을 사용한 Adaptee의 역할을 이용한다!
  • Object Adapter - 위임을 사용한 Adaptee의 역할을 이용한다!

Client

  • Target 인터페이스를 사용한다.

Class Adapter

- 상속

Adapter를 만들때 Target과 Adaptee의 서브클래스로 만든다.

https://www.programmerall.com/article/11101808864/

[Class Adapter 구현]

https://lee1535.tistory.com/72

// 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에 요청을 전달한다

https://www.programmerall.com/article/11101808864/

[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

 

Cory's Developing & Life.

Cory's Developing & Life.

kscory.com

https://jusungpark.tistory.com/22

 

디자인패턴 - 어댑터 패턴 (adapter pattern)

어댑터 패턴 (adapter pattern) 한 클래스의 인터페이스를 클라이언트에서 사용하고자하는 다른 인터페이스로 변환한다. 어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스

jusungpark.tistory.com

https://lee1535.tistory.com/72

 

[디자인패턴/Design Pattern] Adapter 패턴 / 어뎁터 패턴 / Wrapper 패턴

관련 내용은 [자바 언어로 배우는 디자인 패턴 입문] 이라는 책의 공부 내용을 개인적으로 정리한 내용입니다. 처음 배우는 부분이기 때문에 틀린 부분이 있으면 지적해주시면 감사하겠습니다.

lee1535.tistory.com

https://kscory.com/dev/design-pattern/adapter

 

Cory's Developing & Life.

Cory's Developing & Life.

kscory.com

https://readystory.tistory.com/125

 

[구조 패턴] 어댑터 패턴(Adapter Pattern) 이해 및 예제

어댑터 패턴은 구조 패턴(Structural Pattern) 중 하나로, 서로 관계없는 인터페이스들을 함께 사용할 수 있게 하는 패턴입니다. 구조 패턴(Structural Pattern)이란? 구조 패턴이란 작은 클래스들을 상속과

readystory.tistory.com

** 그냥 하루하루 개인 공부한 것을 끄적 거리는 공간입니다.

이곳 저곳에서 구글링한 것과 강의 들은

내용이 정리가 되었습니다.

그림들은 그림밑에 출처표시를 해놓았습니다.

문제가 될시 말씀해주시면 해당 부분은 삭제 하도록하겠습니다. **

반응형

댓글