[JAVA/디자인패턴] Adapter Pattern, 어댑터 패턴

2023. 11. 27. 04:30
반응형

 

어탭터 패턴 (Adapter Pattern)

 

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

 

Adapter의 필요성

 

1. 문제 : 사용 객체의 API가 서로 다름

2. 해결방안 : 함수를 변환하는 객체를 중간에 넣음

3. 결과 : 변경 최소화

 

 

기존 소프트웨어 시스템에서 새로운 업체에서 제공한 클래스 라이브러리를 사용해야 한다고 가정해보자.

새로 채택한 업체에서 사용하는 인터페이스가 기존 업체에서 사용하던 인터페이스와 다른 경우라면 이를 변환해주는 매개체가 필요할 것이다.

어댑터는 클라이언트로부터 요청을 받아서 새로운 업체에서 제공하는 클래스에서 받아들일 수 있는 형 태의 요청으로 변환시켜주는 중개인 역할을 한다.

 

 

Target 

  • Target은 클라이언트가 사용하는 인터페이스를 정의한다.
  • 클라이언트는 이 Target 인터페이스를 통해 서비스나 동작을 호출한다.

Adaptee 

  • Adaptee는 실제로 어떤 기능을 제공하거나 구현하는 클래스이다.
  • 즉, 클라이언트가 필요로 하는 기능을 실제로 구현하고 있는 클래스가 Adaptee 역할을 한다.
  • 클라이언트가 이 클래스를 직접 사용하기 어려운 경우 어탭터 패턴을 적용한다.

Adapter

  • 어댑터는 객체를 감싸는 역할을 함 (Object wrapping)
  • 서로 호환되지 않는 두 개 인터페이스를 연결하는 작업
  • 서로 다른 인터페이스를 동일하게 변환
  • Adaptee를 Target으로 변환하여 클라이언트가 원하는 기능을 사용할 수 있도록 하는 것이 목적

 

 

 


 사례 : 오리 탈을 쓴 칠면조

 

우리는 오리고기를 만드는 음식점인데, 오리의 멸종으로 칠면조로 대신 사용해야한다..

 

 

 

Target : 오리

public interface Duck {
    public void quack();
    public void fly();
}

public class MallardDuck implements Duck {
    public void quack() {
        System.out.println("Quack");
    }
    public void fly() {
        System.out.println("I'm flying");
    }
}

 

 

 

Adaptee : 칠면조

public interface Turkey {
    public void gobble();
    public void fly();
}

public class WildTurkey implements Turkey {
    public void gobble() {
        System.out.println("Gobble gobble"); }
    public void fly() {
        System.out.println("I'm flying a short distance");
    }
}

 

 

 

Adapter : 칠면조를 오리처럼 사용할 수 있도록 변환해준다.

public class TurkeyAdapter implements Duck {
    Turkey turkey;

    public TurkeyAdapter(Turkey turkey) {
        this.turkey = turkey;
    }
    public void quack() {
        turkey.gobble();
    }
    public void fly() {
        for (int i = 0; i < 5; i++) {
            turkey.fly();
        }
    }

}

 

 

 

Client : 어댑터 사용

public class Main {
    public static void main(String[] args) {
        MallardDuck duck = new MallardDuck();
        WildTurkey turkey = new WildTurkey();
        System.out.println("The Turkey says..."); turkey.gobble();
        turkey.fly();
        System.out.println("\nThe Duck says..."); testDuck(duck);

        Duck turkeyAdapter = new TurkeyAdapter(turkey);
        System.out.println("\nThe TurkeyAdapter says..."); testDuck(turkeyAdapter);
    }
    static void testDuck(Duck duck) {
        duck.quack();
        duck.fly();
    }
}

 

 

다음과 같이 칠면조(turkey)를 TurkeyAdapter를 통해 Duck으로 변환시켰다.

기존에 오리를 사용했던 집이므로, 변환기가 있다면 오리가 칠면조로 바뀌어도 같은 방식으로 요리할 수 있다는 것이다.

프로그래밍 관점에서 보면, 인터페이스의 형태가 다른 Object가 공급되었을 때, 기존에 사용하던 형태로 변환하여 사용하면 수정할 부분이 적어진다는 것이다.

반응형

BELATED ARTICLES

more