어댑터 패턴(Adapter pattern)
클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴으로, 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 해준다.
Client
The Client sees only the Target interface.(클라이언트는 Target의 인터페이스만 본다. Target 인터페이스를 사용한다.)
Target
The Adapter implements the Target interface.(Adapter는 Target 인터페이스를 구현한다. Client가 직접적으로 사용하려고 하는 인터페이스를 정의한다. Adaptee가 지원하길 바라는 인터페이스를 의미.)
Adapter
Adapter is composed with the Adaptee.(Adapter는 Adaptee로 구성된다. Target 인터페이스를 상속받아서 구현하는 클래스로 이때 Adaptee의 함수를 사용하게 된다.)
Adaptee
All requests get delegated to the Adaptee.(모든 요청은 Adaptee에게 위임된다. Adapter에서 사용하고자 하는 인터페이스를 정의하고 있다.)
코드를 통해 알아보자.
※ 미국은 110V를 사용하고 있고, 미국에서 산 110V 맥북을 쓰고 있다.
- 110V 전자기기 인터페이스다. 파워온 기능이 있다.
public interface Electronic110V {
void powerOn();
}
- 110V를 사용한 맥북 상품이다. 110V를 사용해서 전원을 켠다.
public class Macbook implements Electronic110V {
@Override
public void powerOn() {
System.out.println("110V 맥북 파워온!!!");
}
}
- Client는 110V용 powerSocket로 사용하고 있다.
public class App {
public static void main(String[] args) {
Macbook macbook = new Macbook();
powerSocket(macbook);
}
private static void powerSocket(Electronic110V electronic110v) {
electronic110v.powerOn();
}
}
※ 한국으로 와서 에어팟을 샀더니 220V를 사용하고 있다.
- 220V 전자기기 인터페이스.
public interface Electronic220V {
void powerOn();
}
- 220V 용으로 생산된 에어팟.
public class AirPods implements Electronic220V {
public void powerOn() {
System.out.println("220V 에어팟 파워온!!");
}
}
- 기존 powerSocket에 에어팟을 꼽았더니 작동하지 않는다 ㅠㅠ
에러 메시지: The method powerSocket(Electronic110V) in the type Client is not applicable for the arguments (AirPods)
public class Client {
public static void main(String[] args) {
AirPods airPods = new AirPods();
powerSocket(airPods);
}
private static void powerSocket(Electtronic110V electronic110v) {
electronic110v.powerOn();
}
}
※ 220V를 110V로 바꿔줄 어댑터가 필요하다.
- 220V로 들어와서 110V로 나가야 하기 때문에 Electronic110V를 implements로 상속받고, 생성자에 220V를 할당한다.
public class AdapterTo110V implements Electronic110V {
private Electronic220V electtronic220v;
public AdapterTo110V(Electronic220V electtronic220v) {
this.electtronic220v = electtronic220v;
}
@Override
public void powerOn() {
electtronic220v.powerOn();
}
}
- 이제 어댑터를 이용하면 기존 powerSocket이나 AirPods 수정 없이 110V용 powerSocket를 사용할 수 있다.
public class Client {
public static void main(String[] args) {
AirPods airPods = new AirPods();
Electronic110V airPods110V = new AdapterTo110V(airPods);
powerSocket(airPods110V);
}
private static void powerSocket(Electronic110V electronic110v) {
electronic110v.powerOn();
}
}
'Develop > Fundmental' 카테고리의 다른 글
Decorator pattern (데코레이터 패턴) (0) | 2022.05.03 |
---|---|
Bridge Pattern(브릿지 패턴) (0) | 2022.05.01 |
Builder Pattern (빌더 패턴) (0) | 2022.04.28 |
팩토리 패턴(Factory Pattern) (0) | 2022.04.26 |
싱글톤 패턴(Singleton Pattern) (0) | 2022.04.24 |
댓글