개요

 어떤 클래스가 이미 작성되어 제공되거나, 이전에 개발했던 클래스가 존재하는데 이를 내가 필요한 기능으로 맞게 변경하려 한다면 어떻게 해야할까? 가장 쉽게 생각할 수 있는 것은 그냥 코드를 수정하는 것이겠지만 이는 효율적인 작업이 아니다. 왜냐면 먼저는 이미 작성된 코드를 열어서 분석하고 내가 필요한 부분에만 맞게 수정하는 비용이 적지 않기 때문이고, 다음으로는 잘 동작하는 코드를 내 필요에 의해 수정했을 때 버그가 발생한다면 이를 테스트하고 해결하는 비용이 만만치 않기 때문이다.

 

 이럴 때 사용하는 디자인 패턴이 바로 Adapter 패턴이다. Wrapper라고 부리기도 한다.

 Adapter의 역할은 제공되는 기능과 - 내가 필요로 하는 기능 이 사이를 연결해주는 역할이다. 때문에 Adapter 패턴을 적용한다면 개발에 있어서 이미 어떤 코드가 제공되고 있을 때, 이를 내가 필요한 조건에 따라 수정해서 사용하거나 이미 개발되어있는 코드의 버전을 변경할 때 개발 비용을 줄일 수 있다.

 

역할

Adapter 패턴에서 필요한 Role은 아래와 같다.

 

Target(대상)

  지금 필요로 하는 기능이나 역할이다. 예제에서는 Print 클래스(혹은 interface)

 

Client(의뢰자)

  Target 이 정해지면 이를 사용하는 역할이다. 예제에서는 main 클래스가 의뢰자 역할.

 

Adaptee(개조되는 대상)

  제공되는 기능이다. 예제에서는 Banner 클래스.

 

Adapter

  제공되는 기능을 필요에 맞춰서 개조하는 어댑터. 예제에서는 PrintBanner이다.

 

 

이득 및 유의사항

 예제를 통해 보면 Banner라는 클래스는 내가 필요로 하는 기능을 포함한채로 제공된다. 하지만 내가 실제로 필요로 하는 기능은 printWeak(), printStrong() 이라는 메서드이기 때문에 Banner클래스를 개조해서 사용해야 한다.

 또한 내가 의뢰자가 사용하고자하는 대상은 Print 클래스이기 때문에 참조 변수는 Print로 선언해야 한다. 의뢰자(Main클래스)는 자신이 처음부터 사용하고자 했던 Print의 printWeak(), printStrong() 메서드만 그대로 사용하면 되고 뒤에서 Adapter(PrintBanner 클래스)가 어떻게 구성되어 처리하고 있는지는 신경쓰지 않아도 되는 것이다.

 

예제 코드

//Target
public abstract class Print2 {
	public abstract void printWeak();
	public abstract void printStrong();
}


//Adaptee
public class Banner {
	
	private String string;
	
	public Banner(String string) {
		this.string = string;
	}
	
	public void showWithParen() {
		System.out.println("("+string+")");
	}
	
	public void showWithAster() {
		System.out.println("*" + string + "*");
	}
}


//Adapter
public class PrintBanner extends Banner implements Print{

	public PrintBanner(String string) {
		super(string);
	}
	
	public void printWeak() {
		showWithParen();
	}
	
	public void printStrong() {
		showWithAster();
	}
}


//Client
public class AdapterTester {
	public static void main(String[] args) {
		Print p = new PrintBanner("hello");
		p.printWeak();
		p.printStrong();
	}

}

 

 

 

 

'디자인 패턴' 카테고리의 다른 글

5. Singleton 패턴  (0) 2020.12.02
4. FactoryMethod 패턴  (0) 2020.12.01
3. Template Method 패턴  (0) 2020.11.30
1. Iterator 패턴  (0) 2020.11.28
0.디자인 패턴이란?  (0) 2020.11.27

+ Recent posts