Free Lines Arrow
본문 바로가기
Design pattern/GoF(인강편)

[Design Pattern] Adapter Pattern

by skahn1215 2021. 10. 28.
728x90
반응형

Adapter pattern 

  • 어댑터 패턴은 호환성이 없는 인터페이스 때문에 동작할수 없는 클래스들이 함께 동작하게 해준다.
  • 아래 그림을 보면 제공된 라이브러리가 호환이 안될경우 어댑터 패턴을 사용하면된다.

 

 

Adapter pattern 구조

  • 가장 널리 알려진 Adapter의 구조이다.
  • Client: 실제 기능을 사용하는 주체
  • Target: 

 

 

 

 

Adapter pattern 예제

  • MathAdapter 를 인터페이스로 만든다.
  • MathAdapterImpl 로 구현한뒤 
  • Math 를 가져다 사용한다.
  • 이렇게 하는 이유는 다음과 같다.
    - 제공 되는 Math 는 입출력 타입이 double 이다.
    - 하지만 입력을 float 을 사용해야 된다.
  • 현재는 간단하지만 로직이 복잡해 지면 어댑터를 사용해야 될수 밖에 없다.
  • Spring MVC 가 어댑터 를 사용하고 있다.

 

 

Math

  • 기존에 제공된 라이브러리라고 생각하면 쉬울것 같다.
  • 리턴 타입과 입력 타입이 double이다.
package patterns.adapter.v1;

public class Math {
    public static double twice(double value) {
        return value * 2;
    }

    public static double half(double value) {
        return value / 2;
    }
}

 

 

MathAdapter

  • 인터페이스를 만든다.
package patterns.adapter.v1;

public interface MathAdapter {
    public Float twice(Float value);
    public Float half(Float value);
}

 

 

MathAdapterImpl

  • 해당 인터페이스에서 데이터를 변환하여
  • 기존에 제공받은 Math 라이브러리를 호출한다.
package patterns.adapter.v1;

public class MathAdapterImpl implements MathAdapter{
    @Override
    public Float twice(Float value) {
        return (float)Math.twice(value.doubleValue());
    }

    @Override
    public Float half(Float value) {
        System.out.println("half 함수 호출");
        return (float)Math.half(value.doubleValue());
    }
}

 

 

Test

package patterns.adapter.v1;

public class Test {
    public static void main(String[] args) {
        MathAdapter mathAdapter = new MathAdapterImpl();
        System.out.println(mathAdapter.twice(10.0f));
        System.out.println(mathAdapter.half(10.0f));
    }
}

 

 

 

 

 

예제2

아래는 위키 에서 가져온 예제이다.

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

 

Adapter pattern - Wikipedia

In software engineering, the adapter pattern is a software design pattern (also known as wrapper, an alternative naming shared with the decorator pattern) that allows the interface of an existing class to be used as another interface.[1] It is often used t

en.wikipedia.org

interface LightningPhone {
    void recharge();
    void useLightning();
}

interface MicroUsbPhone {
    void recharge();
    void useMicroUsb();
}

class Iphone implements LightningPhone {
    private boolean connector;

    @Override
    public void useLightning() {
        connector = true;
        System.out.println("Lightning connected");
    }

    @Override
    public void recharge() {
        if (connector) {
            System.out.println("Recharge started");
            System.out.println("Recharge finished");
        } else {
            System.out.println("Connect Lightning first");
        }
    }
}

class Android implements MicroUsbPhone {
    private boolean connector;

    @Override
    public void useMicroUsb() {
        connector = true;
        System.out.println("MicroUsb connected");
    }

    @Override
    public void recharge() {
        if (connector) {
            System.out.println("Recharge started");
            System.out.println("Recharge finished");
        } else {
            System.out.println("Connect MicroUsb first");
        }
    }
}
/* exposing the target interface while wrapping source object */
class LightningToMicroUsbAdapter implements MicroUsbPhone {
    private final LightningPhone lightningPhone;

    public LightningToMicroUsbAdapter(LightningPhone lightningPhone) {
        this.lightningPhone = lightningPhone;
    }

    @Override
    public void useMicroUsb() {
        System.out.println("MicroUsb connected");
        lightningPhone.useLightning();
    }

    @Override
    public void recharge() {
        lightningPhone.recharge();
    }
}

public class AdapterDemo {
    static void rechargeMicroUsbPhone(MicroUsbPhone phone) {
        phone.useMicroUsb();
        phone.recharge();
    }

    static void rechargeLightningPhone(LightningPhone phone) {
        phone.useLightning();
        phone.recharge();
    }

    public static void main(String[] args) {
        Android android = new Android();
        Iphone iPhone = new Iphone();

        System.out.println("Recharging android with MicroUsb");
        rechargeMicroUsbPhone(android);

        System.out.println("Recharging iPhone with Lightning");
        rechargeLightningPhone(iPhone);

        System.out.println("Recharging iPhone with MicroUsb");
        rechargeMicroUsbPhone(new LightningToMicroUsbAdapter (iPhone));
    }
}

 

 

 

 

 

728x90
반응형

댓글