Pattern - Adapter

2 minute read

오늘은 고통스럽다. 내일은 더 고통스럽다. 그리고 내일 모래는 아름다울 것이다.

  • 마윈 ( 알리바바 그룹 창업자 겸 회장 )

의도

클래스의 인터페이스를 사용자가 기대하는 인터페이스 형태로 적응(변환)시킵니다. 서로 일치하지 않는 인터페이스를 갖는 클래스들을 함께 동작시킵니다.


활용성

  • Target : 사용자가 사용할 응용 분야에 종속적인 인터페이스를 정의하는 클래스
  • Client : Target 인터페이스를 만족하는 객체와 동작할 대상을 처리
  • Adaptee : 인터페이스의 적응이 필요한 기존 인터페이스를 정의하는 클래스
  • Adapter : Target 인터페이스에 Adaptee의 인터페이스를 적응시키는 클래스

  • Adapter 클래스는 하나만 존재해도 수많은 Adaptee 클래스 들과 동작할 수 있다.
  • Adapter 객체가 포함하는 Adaptee에 대한 참조자는 Adaptee의 인스턴스를 관리할 수도 있고, Adaptee 클래스를 상속받는 다른 서브 클래스들의 인스턴스도 관리할 수 있다. 그러므로 하나의 Adapter 클래스로 모든 Adaptee 클래스와 이를 상속 받는 서브클래스 모두를 이용할 수 있게 된다.

  • 사용해야할 때
    • 기존 클래스를 사용하고 싶은데 인터페이스가 맞지 않을 때,
    • 아직 예측하지 못한 클래스나 실제 관련되지 않은 클래스들이 기존 클래스를 재사용하고자 하지만, 이미 정의된 재사용 가능한 클래스가 지금 요청하는 인터페이스를 꼭 정의하고 있지 않을 때,
    • 다시 말해, 이미 만든 것을 재사용하고자 하나 이 재사용 가능한 라이브러리를 수정할 수 없을 때

코드 예제 - 기본


package DesignPattern.gof_adapter.sample01;

public class Electric {

    public static void main(String[] args) {

        V220 v220Product = new KoreaElecticProduct();

        V110 v110Adatper = new VoltageAdater(v220Product);

        v110Adatper.useElectric();
    }
}     


// 전압 V110                               
package DesignPattern.gof_adapter.sample01;

public interface V110 {
    public void useElectric();
}

// 전압 V110 용 베트남 제품   
package DesignPattern.gof_adapter.sample01;

public class VietnamElecticProduct implements V110 {

    public void useElectric() {
        System.out.println("베트남의 110 볼트 전기 제품을 사용합니다.");
    }
}

// 전압 V220          
package DesignPattern.gof_adapter.sample01;

public interface V220 {
    public void useElectric();
}

// 전압 V220 용 한국 제품
package DesignPattern.gof_adapter.sample01;

public class KoreaElecticProduct implements V220 {

    public void useElectric() {
        System.out.println("한국의 220 볼트 전기 제품을 사용합니다.");
    }
}

// 전압 V110에서 V220을 사용할 수 있게 해주는 Adapter
package DesignPattern.gof_adapter.sample01;

public class VoltageAdater implements V110{

    private final V220 v220;

    public VoltageAdater(V220 v220){
        this.v220 = v220;
    }

    public void useElectric() {

        System.out.println("V110 볼트의 전압을 V220의 기기를 사용할 수 있게 전압을 조정합니다.");

        v220.useElectric();
    }
}
    

Kotlin - Adapter


package bong.lines.patterns.adapter.inf

interface V110 {
    fun useElectric()
}

package bong.lines.patterns.adapter.inf

interface V220 {
    fun useElectric()
}


package bong.lines.patterns.adapter.impl

import bong.lines.patterns.adapter.inf.V220

class KoreanElectricProduct : V220 {
    override fun useElectric() {
        print("한국의 220 볼트 전기 제품을 사용합니다.")
    }
}

package bong.lines.patterns.adapter.impl

import bong.lines.patterns.adapter.inf.V110

class VietnamElectricProduct : V110 {
    override fun useElectric() {
        print("베트남의 110 볼트 전기 제품을 사용합니다.")
    }
}

package bong.lines.patterns.adapter.impl

import bong.lines.patterns.adapter.inf.V110
import bong.lines.patterns.adapter.inf.V220

class VoltageAdapter(val v220: V220) : V110 {
    override fun useElectric() {
        v220.useElectric()
    }
}


package bong.lines.patterns.adapter

import bong.lines.patterns.adapter.impl.KoreanElectricProduct
import bong.lines.patterns.adapter.impl.VoltageAdapter
import bong.lines.patterns.adapter.inf.V110
import bong.lines.patterns.adapter.inf.V220

fun main() {
    var v220: V220 = KoreanElectricProduct()

    var voltageAdapter : V110 = VoltageAdapter(v220)

    voltageAdapter.useElectric()
}