1_[spring]어댑터패턴
디자인패턴2 - 어댑터 패턴
SOLID 설계 원칙 중 개방폐쇄원칙인 OCP 원칙을 따름!
중간에 인터페이스를 두어서 재사용성을 높여줌!
구조패턴-Adapter 패턴
어댑터 패턴은 110V와 220V 제품의 차이를 조절하는 돼지코를 생각해보면 그래도 보다 이해하기 쉽다!
먼저 110V와 220V로 분류하기 위해서 110V,220V를 각각 나타내는 인터페이스가 아래와 같이 존재한다고 생각해보자
package com.designPattern.adapter;
public interface Electronic110 {
//전원켜기
void powerOn();
}
package com.designPattern.adapter;
public interface Electronic220 {
void connect();
}
그리고 여기에서, 이 시점에서
- 110V 전자제품은 “헤어드라이기”
- 220V 전자제품은 “에어컨”과 “청소기”가 있다고 가정하자
실제 전자제품은 다양한 기능이 있지만 단순하게 전원의 on off만 각각 powerOn, connect 메서드로 생각/접근해보자
package com.designPattern.adapter;
public class HairDryer implements Electronic110{
@Override
public void powerOn() {
System.out.println("헤어드라이기 110v On");
}
}
package com.designPattern.adapter;
public class AirConditioner implements Electronic220{
@Override
public void connect() {
//alt+enter->implement methods
System.out.println("에어컨 220V ON");
}
}
package com.designPattern.adapter;
public class Cleaner implements Electronic220{
@Override
public void connect() {
System.out.println("청소기 220V ON");
}
}
더불어서, 이 상황의 전제 속에서, 220V전자제품을 구매했는데, 110V로 변환해서 사용해야만 한다고 생각해보자
그러면 이런 생각이 들 수 있다!
Electronic110 인터페이스와 Electronic220을 연결해줄 수 없는데..?
이 역할을 해주는 것이 바로 Adapter 클래스이다!
서로 상관이 없던 클래스를 연결해주는 것이다!
준비해줄 사항은 추가적으로 아래와 같다!
- 외부에서 클라이언트(220v)가 요구하는 110v를 변환해주기 위한 메서드가 있는 클래스 -AdapterMain클래스의 connect(Electronic110)이 해당됨
- 110v를 구현한 어댑터클래스
-클라이언트를 필드로 가짐
-클라이언트를 인자로 갖는 어댑터 생성자
-110v를 구현하였기 때문에 이의 메서드를 물려받는데, 이 메서드 내부에서 220v의 메서드를 호출
- Adapter클래스
package com.designPattern.adapter;
public class SocketAdapter implements Electronic110{
//자기자신이 110v(connect)인데 220v를 처리해야 하므로 220v를 내부에 가져야 함
private Electronic220 electronic220;
//기본 생성자에서 220v를 받게될것
public SocketAdapter(Electronic220 electronic220){
this.electronic220 = electronic220;
}
@Override
public void powerOn() {
electronic220.connect();
}
}
- AdapterMain 클래스
package com.designPattern.adapter;
public class AdapterMain {
public static void main(String[] args){
HairDryer hd = new HairDryer();
//콘센트에 연결해보기
connect(hd);//헤어드라이기 110v On
Cleaner cl = new Cleaner();
Electronic110 electronic110= new SocketAdapter(cl);
electronic110.powerOn();//청소기 220V ON
connect(electronic110);//청소기 220V ON
// connect(cl);//이 상황에서는 Cleaner는 220v인데 110v로 변환(형변환)하려고 하기 때문에 문제가 되는 것!
//이때 변환을 해주는 것이 Adapter!
AirConditioner airConditioner = new AirConditioner();
Electronic110 electronic110_2 = new SocketAdapter(airConditioner);
electronic110_2.powerOn();//에어컨 220V ON
connect(electronic110_2);//에어컨 220V ON
}
//콘센트
public static void connect(Electronic110 electronic110){
electronic110.powerOn();
}
}
이렇게 되면 220V였던 청소기와 에어컨이 110V의 기능을 구현할 수 있는 것을 확인해볼 수 있다!
나중에 조금 더 익숙해지면 아래의 블로그 글을 공부해보아도 좋을 것 같다! 메모!!
https://yaboong.github.io/design-pattern/2018/10/15/adapter-pattern/