어댑터는 호환성이 없는 기존 클래스의 인터페이스를 변환하여 재사용할 수 있도록 한다.
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");
}
}
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();
}
}
// ...
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);
코드 정상 실행된다