어댑터 패턴

김주언·2022년 7월 14일

JAVA

목록 보기
10/10
post-thumbnail

어댑터는 호환성이 없는 기존 클래스의 인터페이스를 변환하여 재사용할 수 있도록 한다.
SOLID 중 개방폐쇄 원칙을 따른다. (Open Close Principal)

인터페이스와 클래스 생성

110V, 220V 전자제품 클래스를 구현하기 위해 인터페이스를 두개 생성한다.

110V를 사용하는 전자제품 헤어드라이어와 220V를 사용하는 전자제품 에어컨, 클리너 클래스를 생성한다.

Electronic110V

package com.company.designPattern.adapter;

public interface Electronic110V {
    void powerOn();
}

Electronic220V

package com.company.designPattern.adapter;

public interface Electronic220V {
    void connect();
}

HairDryer

package com.company.designPattern.adapter;

public class HairDryer implements Electronic110V {
    @Override
    public void powerOn() {
        System.out.println("Hair Dryer 110v ON");
    }
}

Cleaner

package com.company.designPattern.adapter;

public class Cleaner implements Electronic220V {
    @Override
    public void connect() {
        System.out.println("Cleaner 220v ON");
    }
}

AirConditioner

package com.company.designPattern.adapter;

public class AirConditioner implements Electronic220V {
    @Override
    public void connect() {
        System.out.println("AC 220v ON");
    }
}

Main에서 사용

package com.company.designPattern;

import com.company.designPattern.adapter.Cleaner;
import com.company.designPattern.adapter.Electronic110V;
import com.company.designPattern.adapter.HairDryer;


public class Main {

    public static void main(String[] args) {

        HairDryer hairDryer = new HairDryer();
        connect(hairDryer);

        Cleaner cleaner = new Cleaner();
        connect(cleaner);	// 오류발생
    }

    public static void connect(Electronic110V electronic110V) {
        electronic110V.powerOn();

    }
}

connect()가 110v만 받을 수 있기 때문에 클리너는 오류가 발생한다.

이러한 경우를 해결하기 위해서 어댑터를 생성한다.


어댑터 클래스 생성

220v 클래스를 110v로 변환해줘야한다. 따라서 어댑터 자신의 형태는 110v여야하며 (implements Electronic110V ) 멤버변수로 220v를 가진다.

package com.company.designPattern.adapter;

public class SocketAdapter implements Electronic110V {
    private Electronic220V electronic220V;

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

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

Main.java 수정

// ...
		Cleaner cleaner = new Cleaner();
        AirConditioner airConditioner = new AirConditioner();

        //connect(cleaner);
        //connect(airConditioner);

        Electronic110V _cleaner = new SocketAdapter(cleaner);
        Electronic110V _airConditioner = new SocketAdapter(airConditioner);

        connect(_cleaner);
        connect(_airConditioner);

코드 정상 실행된다

profile
학생 점심을 좀 차리시길 바랍니다

0개의 댓글