Clean Code

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

yaini 2022. 3. 8. 00:19
반응형

 

어댑터

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

 

어댑터 패턴

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

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

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

 

출처: 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
반응형