yaini
정리하는 습관
yaini
전체 방문자
오늘
어제
  • 분류 전체보기 (43)
    • CS (4)
    • Java (14)
      • build (1)
      • spring (6)
      • JPA (4)
    • Database (5)
      • MySQL (5)
    • Clean Code (11)
    • Devops (9)
      • CI (2)
      • CD (2)
      • AWS (4)
    • ETC (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Hibernate
  • 구조패턴
  • 디자인 패턴
  • InnoDB
  • ABAC
  • 타겟 그룹
  • 자바
  • 격리 수준
  • 구조 패턴
  • 디자인패턴
  • AWS
  • exsits
  • 클린 아키텍처
  • 계층형 아키텍처
  • Spring
  • java
  • 레코드 수준 잠금
  • s3
  • ORM
  • 만들면서 배우는 클린 아키텍처
  • Real MySQL 8.0
  • MySQL
  • 데이터베이스
  • 생성 패턴
  • JPA
  • database
  • querydsl
  • SQL
  • Gradle
  • Terraform

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
yaini

정리하는 습관

[Design Pattern] 구조 패턴 - 어댑터 패턴
Clean Code

[Design Pattern] 구조 패턴 - 어댑터 패턴

2022. 3. 8. 00:19
반응형
  • github 코드
    https://github.com/yaini/Spring_Study/tree/spring-3-design-pattern-structural/design-pattern/src/main/java/structural

 

어댑터

다른 전기나 기계 장치를 서로 연결해서 작동할 수 있도록 만들어 주는 도구

 

어댑터 패턴

클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴

호환성이 없는 인터페이스를 함께 동작할 수 있도록 만들어 준다.

또한 기존 클래스의 소스코드를 수정하지 않고 기존 인터페이스에 맞춰서 동작이 가능하도록 한다는 장점이 있다.

 

출처: https://en.wikipedia.org/wiki/Adapter_pattern

객체 어댑터

class CardObjectAdapter implements Card{

    TrafficCard trafficCard;

    public CardObjectAdapter(TrafficCard trafficCard){
        this.trafficCard = trafficCard;
    }

    @Override
    public void pay() {
        trafficCard.trafficPay();
    }
}

 

컴포지션을 사용하며, 클래스와 인터페이스 모두 wrapping 할 수 있다.

어댑터를 사용하여 연결할 클래스를 Adaptee라고 했을때, 객체 어댑터는 Adaptee 클래스를 내부 객체로 생성하여 연결한다.

장점

  • 다양한 서브 클래스 구성을 가질 수 있다.

단점

  • 객체의 인스턴스를 생성해야 한다.

클래스 어댑터

class CardClassAdapter extends TrafficCard implements Card{

    @Override
    public void pay() {
        this.trafficPay();
    }
}

상속을 사용하여 클래스를 wrapping한다.

Adaptee를 객체를 생성하는 방법이 아닌 상속을 통해 연결한다.

장점

  • 객체의 인스턴스를 생성하지 않고 오버라이드가 가능하다.

단점

  • 다중 상속이 불가능 하다.

 

전체 코드

public class Adapter {
    public static void main(String[] args){
        CardClassAdapter classAdapter = new CardClassAdapter();
        classAdapter.pay();

        CardObjectAdapter objectAdapter = new CardObjectAdapter(new TrafficCard());
        objectAdapter.pay();

    }
}

interface Card{
    void pay();
}

class TrafficCard{

    public void trafficPay() {
        System.out.println("Traffic Card Pay");
    }
}

class CardObjectAdapter implements Card{

    TrafficCard trafficCard;

    public CardObjectAdapter(TrafficCard trafficCard){
        this.trafficCard = trafficCard;
    }

    @Override
    public void pay() {
        trafficCard.trafficPay();
    }
}

class CardClassAdapter extends TrafficCard implements Card{

    @Override
    public void pay() {
        this.trafficPay();
    }
}

 

참고

https://invincibletyphoon.tistory.com/20
https://gogetem.tistory.com/221
https://en.wikipedia.org/wiki/Adapter_pattern
반응형

'Clean Code' 카테고리의 다른 글

[Design Pattern] 구조 패턴 - 퍼사드 패턴  (0) 2022.03.14
[Design Pattern] 구조 패턴 - 브리지 패턴  (0) 2022.03.12
[Design Pattern] 구조 패턴 - 컴포지트 패턴  (0) 2022.03.06
[Design Pattern] 구조 패턴 - 데코레이터 패턴  (0) 2022.03.03
[Design Pattern] 생성 패턴 - 싱글톤 패턴  (0) 2022.03.03
    'Clean Code' 카테고리의 다른 글
    • [Design Pattern] 구조 패턴 - 퍼사드 패턴
    • [Design Pattern] 구조 패턴 - 브리지 패턴
    • [Design Pattern] 구조 패턴 - 컴포지트 패턴
    • [Design Pattern] 구조 패턴 - 데코레이터 패턴
    yaini
    yaini

    티스토리툴바