DESIGN PATTERN

[디자인패턴] 어댑터 패턴(Adapter Pattern)이란? - 개발자 배찌

개발자 배찌 2022. 4. 11. 15:28
728x90

😀어댑터 패턴이란?
한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환한다.
어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있다.

즉, 어댑터 패턴은 '돼지코 콘센트'처럼 기존 클래스를 재사용 할 수 있도록
중간에서 맞춰주는 역할을 한다.

Client는 Target인터페이스를 사용하여 메서드를 호출한다.
Adapter에서는 Adaptee 인터페이스를 사용하여 ConcreteMethod 호출로 변경한다. 이때 client는 중간에 Adapter가 존재한다는 것을 인식하지 못한다.

😀코드로 알아봅시다!
110V 헤어드라이기와 220V 에어컨이 있다.
220V에어컨을 틀기 위해 어댑터를 사용 하여 110V에 끼워맞추기

Electronic110V.java

package study.adapterPattern.code0;

public interface Electronic110V {
    void powerOn(); //전원을 켜다
}


Electronic220V.java

package study.adapterPattern.code0;

public interface Electronic220V {
    void connect(); //전원을 켜다
}


HairDryer.java

package study.adapterPattern.code0;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class HairDryer implements Electronic110V{
    @Override
    public void powerOn() {
        log.info("헤어드라이기 110V on");
    }
}


AirConditioner.java

package study.adapterPattern.code0;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class AirConditioner implements Electronic220V{
    @Override
    public void connect() {
        log.info("에어컨 220V on");
    }
}


Adapter.java

package study.adapterPattern.code0;

public class Adapter implements Electronic110V{

    public Electronic220V electronic220V;

    public Adapter(Electronic220V electronic220V){
        this.electronic220V = electronic220V;
    }

    @Override
    public void powerOn() {
        electronic220V.connect();
    }
}


AdapterPatternTest.java

package study.adapterPattern;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import study.adapterPattern.code0.Adapter;
import study.adapterPattern.code0.AirConditioner;
import study.adapterPattern.code0.Electronic110V;

@Slf4j
public class AdapterPatternTest {
    @Test
    void code0test(){
        AirConditioner airConditioner = new AirConditioner();
        Electronic110V adapter = new Adapter(airConditioner);
        connect(adapter);
    }
    void connect(Electronic110V electronic110V){
        electronic110V.powerOn();
    }

}