728x90
반응형
Adapter pattern
- 어댑터 패턴은 호환성이 없는 인터페이스 때문에 동작할수 없는 클래스들이 함께 동작하게 해준다.
- 아래 그림을 보면 제공된 라이브러리가 호환이 안될경우 어댑터 패턴을 사용하면된다.
Adapter pattern 구조
- 가장 널리 알려진 Adapter의 구조이다.
- Client: 실제 기능을 사용하는 주체
- Target:
Adapter pattern 예제
- MathAdapter 를 인터페이스로 만든다.
- MathAdapterImpl 로 구현한뒤
- Math 를 가져다 사용한다.
- 이렇게 하는 이유는 다음과 같다.
- 제공 되는 Math 는 입출력 타입이 double 이다.
- 하지만 입력을 float 을 사용해야 된다. - 현재는 간단하지만 로직이 복잡해 지면 어댑터를 사용해야 될수 밖에 없다.
- Spring MVC 가 어댑터 를 사용하고 있다.
Math
- 기존에 제공된 라이브러리라고 생각하면 쉬울것 같다.
- 리턴 타입과 입력 타입이 double이다.
package patterns.adapter.v1;
public class Math {
public static double twice(double value) {
return value * 2;
}
public static double half(double value) {
return value / 2;
}
}
MathAdapter
- 인터페이스를 만든다.
package patterns.adapter.v1;
public interface MathAdapter {
public Float twice(Float value);
public Float half(Float value);
}
MathAdapterImpl
- 해당 인터페이스에서 데이터를 변환하여
- 기존에 제공받은 Math 라이브러리를 호출한다.
package patterns.adapter.v1;
public class MathAdapterImpl implements MathAdapter{
@Override
public Float twice(Float value) {
return (float)Math.twice(value.doubleValue());
}
@Override
public Float half(Float value) {
System.out.println("half 함수 호출");
return (float)Math.half(value.doubleValue());
}
}
Test
package patterns.adapter.v1;
public class Test {
public static void main(String[] args) {
MathAdapter mathAdapter = new MathAdapterImpl();
System.out.println(mathAdapter.twice(10.0f));
System.out.println(mathAdapter.half(10.0f));
}
}
예제2
아래는 위키 에서 가져온 예제이다.
https://en.wikipedia.org/wiki/Adapter_pattern
interface LightningPhone {
void recharge();
void useLightning();
}
interface MicroUsbPhone {
void recharge();
void useMicroUsb();
}
class Iphone implements LightningPhone {
private boolean connector;
@Override
public void useLightning() {
connector = true;
System.out.println("Lightning connected");
}
@Override
public void recharge() {
if (connector) {
System.out.println("Recharge started");
System.out.println("Recharge finished");
} else {
System.out.println("Connect Lightning first");
}
}
}
class Android implements MicroUsbPhone {
private boolean connector;
@Override
public void useMicroUsb() {
connector = true;
System.out.println("MicroUsb connected");
}
@Override
public void recharge() {
if (connector) {
System.out.println("Recharge started");
System.out.println("Recharge finished");
} else {
System.out.println("Connect MicroUsb first");
}
}
}
/* exposing the target interface while wrapping source object */
class LightningToMicroUsbAdapter implements MicroUsbPhone {
private final LightningPhone lightningPhone;
public LightningToMicroUsbAdapter(LightningPhone lightningPhone) {
this.lightningPhone = lightningPhone;
}
@Override
public void useMicroUsb() {
System.out.println("MicroUsb connected");
lightningPhone.useLightning();
}
@Override
public void recharge() {
lightningPhone.recharge();
}
}
public class AdapterDemo {
static void rechargeMicroUsbPhone(MicroUsbPhone phone) {
phone.useMicroUsb();
phone.recharge();
}
static void rechargeLightningPhone(LightningPhone phone) {
phone.useLightning();
phone.recharge();
}
public static void main(String[] args) {
Android android = new Android();
Iphone iPhone = new Iphone();
System.out.println("Recharging android with MicroUsb");
rechargeMicroUsbPhone(android);
System.out.println("Recharging iPhone with Lightning");
rechargeLightningPhone(iPhone);
System.out.println("Recharging iPhone with MicroUsb");
rechargeMicroUsbPhone(new LightningToMicroUsbAdapter (iPhone));
}
}
728x90
반응형
'Design pattern > GoF(인강편)' 카테고리의 다른 글
[Design Pattern] Prototype Pattern (0) | 2021.11.24 |
---|---|
[Design Pattern] Singleton Pattern (0) | 2021.11.24 |
[Design Pattern] Factory Method Pattern (0) | 2021.11.24 |
[Design Pattern] Template Method Pattern (0) | 2021.11.10 |
[Design Pattern] Strategy Pattern (0) | 2021.10.28 |
댓글