디자인 패턴

[디자인 패턴] 9. 어댑터 패턴

Song hyun 2024. 9. 26. 11:06
728x90
반응형

[디자인 패턴] 9. 어댑터 패턴

 

 

1. 어댑터 패턴이란?

-어댑터 패턴(Adapter Pattern)은 호환되지 않는 인터페이스를 가진 클래스들을 함께 동작할 수 있도록 변환해주는 디자인 패턴이다.

=> 즉, 기존 클래스의 인터페이스가 요구사항과 맞지 않을 때, 새로운 인터페이스를 기존 클래스에 맞추어주는 역할!

=> 이를 통해 호환성 문제를 해결하고, 새로운 코드와 결합할 수 있다!

=> 정리: 어댑터 패턴은 서로 다른 인터페이스를 가진 객체들이 함께 동작할 수 있도록 변환해주는 패턴이다!!

 

 

2. 시나리오 코드

(1) MyHouse.java

package adapter;

public class MyHouse {

    // 정적 메서드 (기능)
    // 집에 220V 전기 콘센트를 연결하는 메서드
    public static void homeConnect(IElectronic220v electronic220v){
        // 청소기, 드라이어기, 냉장고, TV
        electronic220v.connect();
    }

    public static void main(String[] args) {
        
        // 1. 

        // 집 콘센트에 220v 스펙을 구현한 에어컨을 연결해보자.
        AirConditioner airConditioner = new AirConditioner();
        homeConnect(airConditioner);

        HairDryer dryer = new HairDryer();
        // 문제 발생
        // homeConnect(dryer); 220v에는 연결 불가

        // 어댑터 클래스를 사왔음
        ElectronicAdapter 헤어드라이기연결어댑터 = new ElectronicAdapter(dryer);
        homeConnect(헤어드라이기연결어댑터);

    } // end of main

} // end of MyHouse


//  스펙 : 220V 가전기기 인터페이스
interface IElectronic220v{
    void connect();
}

interface IElectronic110v{
    void connect();
}

/**
 * InnerMyHouse
 */
class AirConditioner implements IElectronic220v {
    @Override
    public void connect() {
        System.out.println("에어컨 연결 220v on");
    }
}

class HairDryer implements IElectronic110v {
    @Override
    public void connect() {
        System.out.println("헤어드라이기 연결 110v on");
    }
}

 

(2) ElectronicAdapter.java

package adapter;

// 핵심 개념
// 어댑터 클래스는 두 객체 간의 중재자로서, 서로 다른 인터페이스를 가진 객체들이
// 함께 동작할 수 있게 한다.

// 어댑터 클래스 : 110v 기기를 220v 전압에서 사용할 수 있도록 변환하기

// 2. 변환하고자 하는 스펙을 구현해야 한다.
public class ElectronicAdapter implements IElectronic220v{

    // 1. 변환시킬 스펙을 포함 관계로 가지고 있어야 한다.
    private IElectronic110v electronic110v;

    // 3. 생성자를 통해서 110v 가전기기를 주입받음.
    // 이를 통해 110v와 220v를 연결하게 처리한다.
    public ElectronicAdapter(IElectronic110v electronic110v) {
        // 멤버 변수에 초기화 처리
        this.electronic110v = electronic110v;
    }

    @Override
    public void connect() {
        // 어댑터는 220v 인터페이스로 호출된 메서드를 110v 기기의 connect()로 변환하여 실행한다.
        electronic110v.connect();
        System.out.println("어댑터를 통해 110v 가전기기를 220v 스펙에 연결합니다.");
    }
}
728x90
반응형