Java언어로 배우는 디자인패턴 입문 정리 - 2. Adapter Pattern

양정훈·2021년 1월 30일
3
post-thumbnail

본 내용은 Java언어로 배우는 디자인패턴 입문(한빛미디어) 책을 보면서 정리한 내용입니다.

소개

  • 이미 제공되어 있는 코드를 다시 사용하기 위해서 필요로 하는 것 사이의 간격을 줄여주는 패턴
  • Wrapper Pattern 이라고도 함
  • Adapter Pattern의 종류는 두 가지가 있음
    - 클래스에 의한 Adapter Pattern(상속 이용)
    - 인스턴스에 의한 Adapter Pattern(위임 이용)

실습 예제

Java.util.Properties 클래스에서 제공하는

void load(InputStream in) throws IOException
void store(OutputStream out, String header) throws IOException

해당 메서드들을 Adapter Pattern을 이용하여 프로퍼티의 집합을 파일에 보존하는 FileProperties 클래스를 만들기를 해본다.

Target 역할을 하는 FileIO Interface는 다음과 같이 제공이 된다.

import java.io.*;

public interface FileIO {
    public void readFromFile(String filename) throws IOException;
    public void writeToFile(String filename) throws IOException;
    public void setValue(String key, String value);
    public String getValue(String key);
}

Client 역할을 하는 Main Class 는 다음과 같이 제공이 된다.

import java.io.*;

class Main {
    public static void main(String[] args) {
        FileIO f = new FileProperties();
        try {
            f.readFromFile("file.txt");
            f.setValue("year", "2000");
            f.setValue("month", "11");
            f.setValue("day", "20");
            f.writeToFile("newfile.txt");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

이 때, java.util.Properties를 Adaptee로 하는 Adapter Class인 FileProperties Class를 작성해보자.

입력 파일(file.txt)

year=1999

출력 파일(newfile.txt)

#written by FileProperties
#Sat Jan 30 18:13:43 KST 2021
month=11
year=2000
day=20

Adapter 역할의 FileProperties는 다음과 같다.


import java.io.*;
import java.util.*;

public class FileProperties extends Properties implements FileIO {
    public FileProperties() {
        super();
    }

    public void readFromFile(String filename) throws IOException {
        load(new FileInputStream(filename));
    }

    public void writeToFile(String filename) throws IOException {
        store(new FileOutputStream(filename), "written by FileProperties");
    }

    public void setValue(String key, String value) {
        setProperty(key, value);
    }

    public String getValue(String key) {
        return getProperty(key);
    }
}

UML 다이어그램

  • 클래스를 이용한 Adapter Pattern(상속)

  • 인스턴스에 의한 Adapter Pattern(위임)

정리

  • Target의 역할
    - 필요로 하는 메소드를 제공하는 역할
  • Client의 역할
    - Target 역할의 메소드를 사용해서 일을 하는 역할
    - 예제에서는 Main 클래스
  • Adaptee의 역할
    - 이미 준비되어 있는 메소드를 제공하는 역할
  • Adapter의 역할
    - Adaptee의 메소드를 사용하되, Target에서 정의한 API의 형태로 사용할 수 있게 해주는 역할
    - 상속 또는 위임으로 구현할 수 있음

활용법

  • 기존의 클래스 코드를 직접 수정 하지 않고 내가 사용하는데 필요한 클래스를 중간에 끼워서 사용하기 때문에, 기존 코드의 신뢰성을 보장받을 수 있음.
  • 수정해야 하는 코드의 범위가 줄어들기 때문에 더 많은 버그가 나올 확률이 줄어든다.
  • 기존 버전과 새로운 버전을 공존시키고 보수를 간단하게 하는데 사용. (API versioning 등)
  • 새로운 버전만 보수를 하려할 때, 새로운 버전을 Adaptee 역할로 하고 기존 버전을 Target 역할로 하고 이를 연결하는 Adapter 역할로 버전의 호환성을 유지하며 보수 가능.
profile
꿈을 현실로 만드는 성장형 인간

0개의 댓글