Adapter

GamSa Ham·2022년 10월 14일
0

GoF디자인패턴

목록 보기
4/22

의도

  • 클래스의 인터페이스를 사용자가 기대하는 인터페이스 형태로 적응시킵니다.

    서로 일치하지 않는 인터페이스를 갖는 클래스들을 함께 동작시킵니다.

다름 이름

  • 래퍼(wrapper)

활용성

  1. 기존 클래스를 사용하고 싶은데 인터페이스가 맞지 않을때
  2. 이미 만든 것을 재사용 하고자 하나 이 재사용 가능한 라이브러리를 수정할 수 없을 때

구조

참여자

  • Target: 사용자가 사용할 응용 분야에 종속적인 인터페이스를 정의하는 클래스
  • Client: Target 인터페이스를 만족하는 객체와 동작할 대상
  • Adaptee: 인터페이스의 적응이 필요한 기존 인터페이를 정의하는 클래스로서, 적응대상자라고 합니다.
  • Adapter: Target 인터페이스에 Adaptee의 인터페이스를 적응시키는 클래스

예제소스

  • TextView와 같이 이미 존재하기는 하지만 현재 이를 사용하고자 하는 클래스와는 아무런 연관 없이 개발된 클래스이거나, 서로 일치하지 않는 인터페이스를 갖는 클래스들을 잘 통합하여 하나의 응용프로그램을 개발해야 할 때
  • TextView와 Shape인터페이스를 일치 시키고 싶을 때

방법1

Shape 인터페이스와 TextView를 상속 받아서 구현을 하던지

방법2

TextView의 인스턴스를 TextShape에 포함시키고 TextView 인터페이스를 사용하여 TextShape를 구현


class Point {}
class Manipulator {}
class TextManipulator extends Manipulator{}
class Coord{}

// 기존 정의 되어있는 라이브러리 Shape
interface Shape {

    void boundingBox(Point bottomLeft, Point topRight);
    Manipulator createManipulator();
}

// 추가 개발하고 싶은 기능 TextView, TextShape
interface TextView {
    default void getOrigin(Coord x, Coord y){}
    default void getExtent(Coord width, Coord height){}
    boolean isEmpty();

}

// 방법 1
class TextShapeType1 implements Shape, TextView {

    @Override
    public void boundingBox(Point bottomLeft, Point topRight) {
        //...
    }

    @Override
    public Manipulator createManipulator() {
        return new TextManipulator();
    }

    @Override
    public boolean isEmpty() {
        return false;
    }
}

// 방법2
class TextShapeType2 implements Shape{
    private TextView textView;

    public TextShapeType2(TextView textView) {
        this.textView = textView;
    }

    @Override
    public void boundingBox(Point bottomLeft, Point topRight) {
        //...
    }

    @Override
    public Manipulator createManipulator() {
        return new TextManipulator();
    }
}
  • 방법1 다이어그램

  • 방법2 다이어그램

profile
안녕하세요. 자바를 좋아하고 디자인 패턴, Refactoring, Clean Code에 관심이 많은 백엔드 개발자입니다.

0개의 댓글