[ Java ] 어댑터 패턴 (Adapter Pattern)
어댑터 패턴은
코드의 변경 없이 호환성이 없는 기존 클래스의 인터페이스를 변환하여 재사용할 수 있도록 해준다
( SOLID중 개방 폐쇄 원칙(OCP)을 따른다 )
실생활에서는 100v를 220v로 변경해주는 돼지코! 변환기로 예를 들 수 있다
▶ Adapter Pattern
집에서 사용 가능한 전력이 110v라고 가정하에 어댑터 패턴을 어떻게 사용하는지 살펴보자!
우선 110v, 220v 인터페이스를 만들어준다
Electronic110 V, Electronic220 V
그리고 110v와 220v를 사용하는 가전제품들을 클래스로 만들어준다
HairDryer.java
110v를 사용하는 헤어드라이어
AirConditioner.java
220v를 사용하는 에어컨
Cleaner.java
220v를 사용하는 청소기
이제 가전제품들을 사용하기 위해서 Main 클래스로 이동!
Main
메인 클래스 안에 110v를 매개변수로 사용하는 콘센트를 만들어준다!
( connet 메소드가 static인 이유는 메인에서 사용해줘야 하는데 메인이 static이기 때문! )
헤어 드라이를 콘센트에 연결해 실행시키면 다음과 같은 결과를 볼 수 있다
이제 220v인 청소기를 구매해서 사용해본다고 가정할 때
헤어 드라이처럼 똑같이 연결해주면 에러가 발생한다.
왜냐면 콘센트에선 110v만 사용이 가능한데 청소기는 220v를 상속받아 만들어진 제품이기 때문이다
따라서 Adapter Pattern을 이용해서 사용 가능하게 만들어줘야 한다!
220v를 110v로 변환시켜주는 어댑터 클래스를 만들어준다
SocketAdapter.java
SocketAdapter가 Electronic110V를 상속받은 이유는 220v를 110v로 변환시켜 결국 110v로 만들어줘야 하기 때문임!
기본 생성자에 220v를 사용하는 가전제품을 받아서 내가 가진 220v에 할당시켜주고,
powerOn 메소드에서 이 가전제품을 연결해주는 방식이다
package com.company.design.adpater;
public class SocketAdapter implements Electronic110V{
private Electronic220V electronic220V;
public SocketAdapter(Electronic220V electronic220V){
this.electronic220V = electronic220V;
}
@Override
public void powerOn() {
electronic220V.connect();
}
}
다시 Main으로 돌아와 만든 SocketAdapter를 이용해 220v 가전제품을 사용해보자
Main
package com.company.design;
import com.company.design.adpater.*;
public class Main {
public static void main(String[] args) {
HairDryer hairDryer = new HairDryer();
connect(hairDryer);
Cleaner cleaner = new Cleaner();
Electronic110V cleanerAdapter = new SocketAdapter(cleaner);
connect(cleanerAdapter);
AirConditioner airConditioner = new AirConditioner();
Electronic110V AirAdapter = new SocketAdapter(airConditioner);
connect(AirAdapter);
}
// 콘센트
public static void connect(Electronic110V electronic110V){
electronic110V.powerOn();
}
}
이렇게 자기 자신의 상태는 변화시키지 않고 중간에 인터페이스 형태로 변화시키는 패턴을 어댑터 패턴이라고 한다!