Adapter Pattern

Muzi·2023년 3월 31일
0

디자인 패턴

목록 보기
2/14

예를 들어, 직류 12볼트 노트북을 교류 100볼트 AC전원에 연결한다고 가정하자
그때 우리는 AC 어댑터라는 장치를 사용한다. AC 어댑터는 '교류 100볼트'를 지금 필요한 '직류 12볼트'로 변환한다

프로그램 세계에서도 이미 제공된 코드를 그대로 사용할 수 없을때, 필요한 형태로 변환한 후 이용하는 경우가 있는데, '이미 제공된 것'과 '필요한 것'사이의 '차이'를 메우는게 Adapter Pattern

Adapter 패턴에는 두가지가 있다

  • 클래스에 의한 Adapter 패턴(상속)
  • 인스턴스에 의한 Adapter 패턴(위임)

상속을 사용한 패턴

Hello라는 문자열을 (Hello), *Hello*로 표시하는 프로그램

전원의 비유예제 프로그램
제공된 것교류 100볼트Banner 클래스(showWithParen, showWithAster)
변환 장치어댑터PrintBanner 클래스
필요한 것직류 12볼트Print 인터페이스(printWeak, printStrong)
// 미리 제공되는 클래스
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 클래스를 확장(extends)하여 showWithParen, showWithAster를 상속받음
  • 필요한 Print 인터페이스를 구현(implements)하여 printWeak, printStrong을 구현

Printer 인터페이스

public interface Print {

    public abstract void printWeak();

    public abstract void printStrong();
}

PrintBanner 클래스

// 어댑터 역할
public class PrintBanner extends Banner implements Print {

    public PrintBanner(String string) {
        super(string);
    }

    @Override
    public void printWeak() {
        showWithParen();
    }

    @Override
    public void printStrong() {
        showWithAster();
    }
}

Main 클래스

public class Main {

    public static void main(String[] args) {
        Print p = new PrintBanner("Hello");
        p.printWeak(); // (Hello) 출력
        p.printStrong(); // *Hello* 출력
    }
}
  • Main 클래스 입장에선 PringBanner 클래스가 어떻게 구현됐는지 모른다
  • 따라서, Main 클래스를 전혀 변경하지 않고도 PrintBanner 클래스의 구현을 바꿀 수 있다

위임을 사용한 패턴

위에서 본 예제는 '클래스를 사용한' Adapter 패턴 아래 예제는 '인스턴스를 사용한' Adapter 패턴

// 인터페이스가 아닌 클래스
public abstract class Print {

    public abstract void printWeak();

    public abstract void printStrong();
}

PrintBanner 클래스

public class PrintBanner extends Print {

    private Banner banner;

    public PrintBanner(String string) {
        this.banner = new Banner(string);
    }

    @Override
    public void printWeak() {
        banner.showWithParen();
    }

    @Override
    public void printStrong() {
        banner.showWithAster();
    }
}
  • PrintBanner 클래스는 banner 필드로 Banner 클래스의 인스턴스를 가진다
  • PrintBanner 클래스의 printWeak호출시 자신이 처리하지않고 Banner의 메소드에 위임

Adapter 패턴의 등장인물

Target(대상)역

  • 노트북을 작동시키는 직류 12볼트에 해당
  • Print 인터페이스(상속의 경우)와 Print 클래스(위임의 경우)가 이 역할

Client(의뢰자)역

  • Target의 메소드를 사용해 일한다, 직류 12볼트로 작동하는 노트북에 해당
  • 예제에서는 Main 클래스

Adaptee(적응 대상자)역

  • 이미 준비된 메소드를 가지는 역할, 교류 100볼트 AC전원에 해당
  • Banner 클래스에 해당
  • Adaptee의 메소드가 Target의 메소드와 일치한다면(Print인터페이스의 메소드와 일치한다면) 아래 Adapter는 등장할 필요 x

Adapter(적응자)역

  • 어댑터에 해당
profile
좋아하는걸 열심히

0개의 댓글