PHpullh

PYTHON · 디자인패턴

어댑터 패턴

어댑터 패턴으로 호환되지 않는 인터페이스를 연결하여 기존 코드를 재사용합니다.

디자인패턴중급adapter어댑터인터페이스호환성

핵심 설명

어댑터 패턴으로 호환되지 않는 인터페이스를 연결하여 기존 코드를 재사용합니다.

Python code

# 기존 XML 라이브러리 (변경 불가)
class XMLParser:
    def parse_xml(self, xml_string: str) -> dict:
        # XML 파싱 시뮬레이션
        return {"format": "xml", "data": xml_string[:30]}

# 기존 CSV 라이브러리 (변경 불가)
class CSVParser:
    def read_csv(self, csv_string: str) -> list:
        return [row.split(",") for row in csv_string.strip().split("\n")]

# 통합 인터페이스
class DataParser:
    def parse(self, data: str) -> dict:
        raise NotImplementedError

# 어댑터들
class XMLAdapter(DataParser):
    def __init__(self):
        self._parser = XMLParser()

    def parse(self, data: str) -> dict:
        result = self._parser.parse_xml(data)
        return {"source": "xml", "content": result}

class CSVAdapter(DataParser):
    def __init__(self):
        self._parser = CSVParser()

    def parse(self, data: str) -> dict:
        rows = self._parser.read_csv(data)
        return {"source": "csv", "rows": len(rows), "content": rows}

# 팩토리로 어댑터 선택
def get_parser(format_type: str) -> DataParser:
    parsers = {"xml": XMLAdapter, "csv": CSVAdapter}
    return parsers[format_type]()

# 사용: 동일한 인터페이스로 다른 형식 처리
for fmt, data in [("xml", "<root>데이터</root>"),
                   ("csv", "이름,나이\nAlice,30\nBob,25")]:
    parser = get_parser(fmt)
    result = parser.parse(data)
    print(f"  [{fmt}] {result}")

학습 팁

어댑터는 기존 라이브러리를 수정하지 않고 통합 인터페이스를 제공할 때 유용합니다.

주의할 점

어댑터가 너무 많은 변환 로직을 가지면 안티패턴이 됩니다. 변환이 복잡하면 별도 변환 계층을 고려하세요.

자주 묻는 질문

어댑터 패턴란 무엇인가요?

어댑터 패턴으로 호환되지 않는 인터페이스를 연결하여 기존 코드를 재사용합니다.

어댑터 패턴 학습 시 주의할 점은 무엇인가요?

어댑터가 너무 많은 변환 로직을 가지면 안티패턴이 됩니다. 변환이 복잡하면 별도 변환 계층을 고려하세요.

Continue Learning

Python 학습을 이어가세요

총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.