[Java]어댑터 패턴(Adapter Pattern)

어댑터 패턴

자바의 데이터베이스 시스템과 같이, 사용자가 구체적인 내부 구조를 몰라도 공통의 인터페이스를 통해 조작할 수 있는 것들이 있다.

이러한 것들을 가능하게 하는 것이 싱글턴 패턴(Singleton pattern) 인데, 변환기라는 뜻을 가진 어댑터의 뜻에 맞게, 호출하는 쪽에 맞게 중간에 변환을 해주는 패턴이다.

예시

패턴이 적용 안된 클래스

아래의 두 클라스가 있다고하자.

public class ClassA {
	void runClassA() {
		System.out.println("ClassA의 메서드가 실행");
	}
}
public class ClassB {
	void runClassB() {
		System.out.println("ClassB의 메서드가 실행");
	}
}

사용자의 입장에선 classA와 classB의 메서드를 사용하기 위해선, 일일이 다른 메서드명으로 호출해야 한다.

public class ClassTest {

	public static void main(String[] args) {
		ClassA classA = new ClassA();
		ClassB classB = new ClassB();

		classA.runClassA();
		classB.runClassB();
	}

}

실행결과

ClassA의 메서드가 실행
ClassB의 메서드가 실행

이렇게 하면 원하는 실행 결과가 나오지만 더 복잡해지는 실제 개발에서,
일일이 runClassA, runClassB, … 가 아니라 runClass로 메서드를 호출하는 것을 통일하고 싶을 땐, 어댑터 패턴을 사용하면 된다.

패턴이 적용 된 클래스

public class ClassA {
	void runClassA() {
		System.out.println("ClassA의 메서드가 실행");
	}
}

class AdapterClassA{
	ClassA classA = new ClassA();
	void runClass() {
		classA.runClassA();
	}
}
public class ClassB {
	void runClassB() {
		System.out.println("ClassB의 메서드가 실행");
	}
}

class AdapterClassB{
	ClassB classB = new ClassB();
	void runClass() {
		classB.runClassB();
	}
}

해당 클래스 밑에, 어댑터 클래스를 만들어 줬다.

public class ClassTest {

	public static void main(String[] args) {
		AdapterClassA adapterClassA = new AdapterClassA();
		AdapterClassB adapterClassB = new AdapterClassB();

		adapterClassA.runClass();
		adapterClassB.runClass();
	}

}

실행결과

ClassA의 메서드가 실행
ClassB의 메서드가 실행

메서드 명이 runClass로 통일되었고, 실행 결과는 동일하다.
이와 같이 호출하는 쪽의 형식에 맞게 중간에서 변환기를 제공하는 것이 어댑터 패턴이다.