2.Adapter Design Pattern

1. Adapter Pattern

연관성 없는 두 객체를 묶어서 사용한다.

2. 학습 목표

알고리즘을 요구사항에 맞춰 사용할 수 있다.

2.1. 의미

Adapter는 사전적의미로는 기계 기구등을 다목적으로 사용하기 위한 부가 기구라고 할 수 있습니다.

2.2. 기본 설계

Adapter

2.3. 요구사항 1

두 수에 대한 다음 연산을 수행하는 객체를 만들기

  1. 수의 두 배의 수를 반환: twiceOf(Float):Float
  2. 수의 half의 수를 반환: halfOf(Float):Float

구현 객체의 이름은 Adapter

Math클래스에서 두배와 절반을 구하는 함수는 이미 구현되어 있습니다.

즉, 어뎁터패턴을 사용하는이유는 미리주어진함수를 어뎁터에서 사용할 수 없기때문에 해당로직을 변경해야하므로 Adapter 를 사용한다.

2.4. 요구사항 2

Math 클래스에 새롭게 두 배를 구할 수 있는 함수가 추가된다.

  1. 새로 구현된 알고리즘을 이용하도록 프로그램을 변경하시오.
  2. 절반을 구하는 기능에서 로그를 찍는 기능을 추가하시오.

3. Code

위의 요구사항처럼 타입의 값과 요구되는 값이 변경되는 경우 Adapter 패턴을 이용하면 의존성을 줄이고 유지보수의 확장성을 올릴 수 있습니다.
즉, 공통 클래스로 사용되던 메소드를 변경해야되는 요구사항이 발생하게 된다면 Adapter, Main을 수정하지 않아도 구현체 부분만 변경해서 해당 요구사항들을 Adapter 패턴으로 적용할 수 있습니다.

main class

1
2
3
4
5
6
7
8
9
package AdapterPattern;

public class Main {
public static void main(String[] args) {
Adapter adapter = new AdapterImpl();
System.out.println(adapter.twiceOf(100f));
System.out.println(adapter.halfOf(80f));
}
}

math class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package AdapterPattern;

public class Math {

public static double twoTime(double num){
return num*2;
}

public static double half(double num){
return num/2;
}

public static Double doubled(Double d){
return d*2;
}

}

adapter interface

1
2
3
4
5
6
7
8
package AdapterPattern;

public interface Adapter {

public Float twiceOf(Float f);

public Float halfOf(Float f);
}

adapter Implements class

1
2
3
4
5
6
7
8
9
10
11
12
13
package AdapterPattern;
public class AdapterImpl implements Adapter{
@Override
public Float twiceOf(Float f) {
return Math.doubled(f.doubleValue()).floatValue();
}

@Override
public Float halfOf(Float f) {
System.out.println("half 함수 호출");
return (float) Math.half(f.doubleValue());
}
}