어뎁터 패턴


어뎁터 패턴 요약 설명

  • 타입 : 구조
  • 설명 : 이미 있는 기능을 사용할 수 있도록 형태로 변형해주는 패턴

어텝터 패턴

우리가 사용하는 전기는 220v로 동일합니다. 하지만 전자기기는 필요한 전압이 가지 각색으로 다릅니다. 그래서 우리는 일상생활에서 전기 장치를 이용할 때에 어뎁터를 이용합니다. 전기라는 에너지 공급 받을 때는 220v로 공급받지만 어뎁터에서 전압을 변경하여 전자기기에 공급합니다. 어뎁터 패턴도 동일합니다. 라이브라러 등에서 제공하는 함수 들이 우리가 필요한 기능에 정확히 일치하지 않기 때문에 중간에 기능을 알맞게 변경해주는 것이 필요합니다.

프로그래머의 일상에서는…

우리가 구현하려는 모든 것들이 아주 새로운 것들이 아닌 경우가 대다수 입니다. 많은 경우에 우리는 라이브러리나 혹은 오픈소스에서 많은 도움을 받습니다. 하지만 우리가 처음에 설계했던 인터페이스와 새롭게 사용하려는 라이브러리와 다를 경우가 대부분입니다. 그런 차이를 없애주는 것이 어뎁터 패턴을 입니다. 우리가 처음 생각했던 인터페이스의 구현체에 사용하려는 라이브러리를 사용할 수 있도록 처리해주는 것이 어뎁터 패턴의 핵심입니다.

UML

예제

어뎁터를 사용할 때 다음과 같은 상황이 발생합니다.

  • 이미 약속된(정의된) interface 가 존재
  • 구현하려는 기능이 이미 구현(라이브러리 등)

아래는 2배와 1/2배를 하는 기능을 구현하기 한 코드를 Adatper 패턴 이용한 예제입니다.

Java 예제


// * 사용하려는 인터페이스
public interface Adapter {
	//두배
	public Double twiceOf(Float num);
	//절반
	public Double halfOf(Float num);

}


// *이미 존재하는 기능
public class Math {
	//두배 
	public static double twoTime(double num){return num*2;}
	//절반
	public static double half(double num){ return num/2;}
}


// * 구현체
public class AdapterImpl implements Adapter {
	@Override
	public Double twiceOf(Float num) {
		return Math.doubled(num.doubleValue());
	}

	@Override
	public Double halfOf(Float num) {
		return Math.half(num);
	}
}

PHP 예제

/**
 * 사용하려는 인터페이스
 */ 
interface Adapter {
	//두배
	function twiceOf($num);
	//절반
	function halfOf($num);
}

/**
 *이미 존재하는 기능
 */
class Math {
	//두배 
	static function twoTime($num){return $num*2;}
	//절반
	static function half($num){ return $num/2;}
}

/**
 * 구현체
 */
class AdapterImpl implements Adapter {
	public function twiceOf($num) {
		return Math::twoTime($num);
	}

	public function halfOf($num) {
		return Math::half($num);
	}
}

C++ 예제

//준비중

Python 예제

#준비중 

C# 예제

////준비중