어댑터 패턴 (Adapter pattern)
- 호환성이 없는 기존 클래스의 인터페이스를 변환하여 재사용할 수 있도록 함
- 개방폐쇄원칙을 따른다
1. 110v, 220v 제품에 적용할 인터페이스 생성
// Electronic110V.java
public interface Electronic110V {
public void powerOn();
}
// Electronic220V.java
public interface Electronic220V {
public void connect();
}
2. 전압이 다른 2개의 제품 생성
// HairDryer.java
public class HairDryer implements Electronic110V {
@Override
public void powerOn() {
System.out.println("110v 헤어드라이기 ON");
}
}
// AirConditioner.java
public class AirConditioner implements Electronic220V{
@Override
public void connect() {
System.out.println("220v 에어컨 ON");
}
}
3. Main.java의 connect 메소드는 110v를 매개변수로 받아 powerOn 메소드를 실행하기 때문에 에어컨은 사용이 불가하다
// Main.java
public static void main(String[] args){
HairDryer hairDryer = new HairDryer();
// 헤어드라이어는 Electronic110V를 상속받기 때문에 사용가능
connect(hairDryer);
AirConditioner airConditioner = new AirConditioner();
// 에어컨은 헤어드라이어와 달리 Electronic220V를 상속 받기 때문에 connect를 사용할 수 없다
// connect(airConditioner)
}
// 콘센트 역할. 매개변수로 Electronic110V를 받는다
public static void connect(Electronic110V electronic110V){
electronic110V.powerOn();
}
4. 220v 제품을 사용할 수 있도록 어댑터를 생성한다
// SocketAdpater.java
// 110V -> 220V로 전압을 변환해주는 돼지코 역할을 한다
// 110V를 상속받아 220V로 변환해줘야하기 때문에 자신은 110V를 입력받아야 한다
public class SocketAdapter implements Electronic110V {
// 연결시켜줘야하기 때문에 자신이 가지고 있어야 함
private Electronic220V electronic220V;
// 기본생성자에서 매개변수에 Electronic220V 할당
public SocketAdapter(Electronic220V electronic220V){
this.electronic220V = electronic220V;
}
@Override
public void powerOn() {
// Electronic220V의 connect 메소드를 호출에서 Electronic110V의 powerOn을 했을 때 동작하도록 한다
electronic220V.connect();
}
}
5. 어댑터를 사용하여 220v 제품을 연결하면 110v의 메소드를 실행할 수 있다
// Main.java
public static void main(String[] args){
...
// 110v 어댑터를 생성하고 SocketAdpater의 매개변수로 에어컨을 넣어준다
Electronic110V adapter = new SocketAdapter(airConditioner);
// 연결 시 에어컨이 아닌 어댑터 값을 넣어준다
connect(adpater);
}
// 콘센트 역할. 매개변수로 Electronic110V를 받는다
public static void connect(Electronic110V electronic110V){
electronic110V.powerOn();
}