어댑터 (Adapter) 패턴
🔗 어탭터 (Adapter) 패턴이란?
-
어탭터 패턴은 이름대로 어댑터 처럼 사용되는 패턴이다.
-
ex) 220V를 사용하는 한국에서 쓰던 기기들을, 어댑터를 사용하면 110V를 쓰는곳에 가서도 그대로 쓸 수 있다.
-
호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 해주는 패턴이다.
-
-
즉, 클래스의 인터페이스를 사용자가 기대하는 인터페이스 형태로 변환시키는 패턴이다.
💎 어댑터 패턴 장점
-
관계가 없는 인터페이스 간 같이 사용 가능
-
프로그램 검사 용이
-
클래스 재활용성 증가
💎 Volt 클래스 - volt의 값을 갖고 있음
package StructurePattern.AdapterPattern;
public class Volt {
private int volts;
public Volt(int volts) {
this.volts = volts;
}
public int getVolts() {
return volts;
}
public void setVolts(int volts) {
this.volts = volts;
}
}
💎 Socket 클래스 - 120볼트를 값으로 갖는 볼트 객체를 생성하는 클래스
package StructurePattern.AdapterPattern;
public class Socket {
public Volt getVolt() {
return new Volt(120);
}
}
💎 120볼트뿐만 아니라 3볼트와 12볼트로 추가로 생성하는 어댑터 인터페이스
package StructurePattern.AdapterPattern;
public interface SocketAdapter {
public Volt get120Volt();
public Volt get12Volt();
public Volt get3Volt();
}
💎 어댑터 패턴 구현 방법
- Class Adapter - 자바의 상속(Inheritance)를 이용한 방법
package StructurePattern.AdapterPattern;
//ClassAdapter 자바의 상속을 이용한 방법
//어댑터 패턴은 클래스의 인터페이스를 사용자가 기대하는 인터페이스 형태로 변환시키는 패턴입니다.
public class SocketClassAdapterImpl extends Socket implements SocketAdapter {
@Override
public Volt get120Volt() {
return getVolt();
}
@Override
public Volt get12Volt() {
Volt v = getVolt();
return convertVolt(v,10);
}
@Override
public Volt get3Volt() {
Volt v = getVolt();
return convertVolt(v,40);
}
private Volt convertVolt(Volt v, int i) {
return new Volt(v.getVolts()/i);
}
}
- Object Adapter - 자바의 합성(Composite)을 이용한 방법
package StructurePattern.AdapterPattern;
//Object Adapter 방식
//어댑터 패턴은 클래스의 인터페이스를 사용자가 기대하는 인터페이스 형태로 변환시키는 패턴입니다.
public class SocketObjectAdapterImpl implements SocketAdapter {
private Socket socket = new Socket();
@Override
public Volt get120Volt() {
return socket.getVolt();
}
@Override
public Volt get12Volt() {
Volt v = socket.getVolt();
return convertVolt(v,10);
}
@Override
public Volt get3Volt() {
Volt v = socket.getVolt();
return convertVolt(v,40);
}
private Volt convertVolt(Volt v, int i) {
return new Volt(v.getVolts()/i);
}
}
💎 어댑터 테스트 코드
package StructurePattern.AdapterPattern;
//어댑터 패턴은 클래스의 인터페이스를 사용자가 기대하는 인터페이스 형태로 변환시키는 패턴입니다.
public class AdapterPatternTest {
public static void main(String[] args) {
testClassAdapter();
testObjectAdapter();
}
private static void testObjectAdapter() {
SocketAdapter socketAdapter = new SocketObjectAdapterImpl();
Volt v3 = getVolt(socketAdapter, 3);
Volt v12 = getVolt(socketAdapter, 12);
Volt v120 = getVolt(socketAdapter, 120);
System.out.println("v3 volts using Object Adapter = " + v3.getVolts());
System.out.println("v12 volts using Object Adapter = " + v12.getVolts());
System.out.println("v120 volts using Object Adapter = " + v120.getVolts());
}
private static void testClassAdapter() {
SocketAdapter socketAdapter = new SocketClassAdapterImpl();
Volt v3 = getVolt(socketAdapter, 3);
Volt v12 = getVolt(socketAdapter, 12);
Volt v120 = getVolt(socketAdapter, 120);
System.out.println("v3 volts using Class Adapter = " + v3.getVolts());
System.out.println("v12 volts using Class Adapter = " + v12.getVolts());
System.out.println("v120 volts using Class Adapter = " + v120.getVolts());
}
private static Volt getVolt(SocketAdapter socketAdapter, int i) {
switch (i) {
case 3: return socketAdapter.get3Volt();
case 12: return socketAdapter.get12Volt();
case 120: return socketAdapter.get120Volt();
default: return socketAdapter.get120Volt();
}
}
}
Comments