[디자인 패턴] Adapter 패턴

이멀젼씨

·

2020. 1. 15. 16:28

- 정의

 

어댑터란 기계 및 기구 등을 다목적으로 사용하기 위한 부가 기구를 말한다

예를들어, 220V에서 110V 전자기기를 사용하기 위해 110V로 변환하는 콘센트와 같은 것을 말한다

 

클래스 인터페이스를 사용자가 기대하는 다른 인터페이스로 사용할 수 있게 하는 패턴이다. 기존 클래스를 수정하지 않고 다른 클래스와 함께 사용하는데 종종 사용되어진다

 

기존 시스템이 이미 갖춰져 있는 상황에서 새로운 요구사항이 주어진다고 해본다. 그러면 그 요구사항에 맞게 기존 시스템을 고치는 것이 아니라, 기존 시스템을 고치지 않고 새로운 클래스를 만들어 요구사항을 충족시키는 중간 매개체 역할을 하는 것이다.

 

- UML

1. 기존 시스템에 해당하는 Math라는 클래스가 있다. Math의 메소드는 입력값의 두배를 double형으로 반환하는 twoTime과 입력값의 반을 반환하는 half, 입력값을 double의 wrapper타입으로 반환하는 doubled가 있다

2. 새로운 요구사항이 생겨 이에 맞는 인터페이스를 정의하였다. 메소드는 입력값의 두배를 float의 wrapper타입으로 반환하는 twiceOf와 halfOf가 있다

3. 요구사항에 대한 구현체에서는 Math클래스의 메소드를 가져와서 float으로 변환하여 처리하였다

 

- 코드

 

Math class

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

public interface Adapter {
	
	// 원하는 기능 정의
	public Float twiceOf(Float f);
	public Float halfOf(Float f);
}

AdapterImpl class

public class AdapterImpl implements Adapter{
	
	@Override
	public Float twiceOf(Float f) {
		return (float) Math.doubled(f.doubleValue()).floatValue();
	}

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

Main class

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

 

 

- 설명

입력값을 float의 wrapper타입으로 두배 또는 1/2배를 반환하는 메소드가 필요하다고 해본다

 

이런 메소드를 새로 작성할 수도 있지만 기존의 시스템에 해당하는 Math클래스의 메소드를 사용하여 재정의 할 수도 있다.

 

메인클래스와 Math클래스 사이에서 Adapter클래스는 어댑터 역할을 하게 된 것이며

 

기존 시스템을 수정하지도 않았고, 요구사항을 변경하지도 않고 원하는 일을 수행할 수 있게 되었다