Table of Contents

Adapter Pattern

서로 다른 인터페이스(API)를 갖는 클래스들을 연결하여 바꿔서 재이용.

상속을 이용한 구현

Adaptee

/**
 * 이미 제공되는 API. 개조될 대상.
/*
public class OldVerAPI {
	private String str;

	public OldVerAPI(String str) {
		super();
		this.str = str;
	}
	
	public void showMessage() {
		System.out.println(str);
	}
}

Target, Adapter

/**
 * 필요한, 변환될 것. Target
 */
public interface NewVerAPI {
	void printMessage();
	void printVersion();
}

/**
 * 필요한, 변환될 것의 구현체. Adapter
 */
public class NewVerAPIImpl extends OldVerAPI implements NewVerAPI {

	public NewVerAPIImpl(String str) {
		super(str);
	}

	@Override
	public void printMessage() {
		showMessage();
	}

	@Override
	public void printVersion() {
		System.out.println("v1.0");
	}
}

Client

/**
 * Target 역할의 Method를 이용하여 수행.
 */
public class Main {
	public static void main(String[] args) {
		NewVerAPI p = new NewVerAPIImpl("test");

		p.printMessage();
		p.printVersion();
	}
}

//test
//v1.0

위임을 이용한 구현

Target이 Class인 경우. Java나 C#은 다중상속이 되지 않기 때문에 다른 인스턴스의 메소드에 맡김

Target, Adapter

/**
 * 필요한, 변환될 것. Target
 */
public interface NewVerAPI {
	void printMessage();
	void printVersion();
}

/**
 * 필요한, 변환될 것의 구현체. Adapter
 */
public class NewVerAPIImpl implements NewVerAPI {
	private OldVerAPI oldVerAPI;
	
	public NewVerAPIImpl(String str) {
		this.oldVerAPI = new OldVerAPI(str);
	}

	@Override
	public void printMessage() {
		oldVerAPI.showMessage();
	}

	@Override
	public void printVersion() {
		System.out.println("v1.0");
	}
}