= Adapter Pattern =
서로 다른 인터페이스(API)를 갖는 클래스들을 연결하여 바꿔서 재이용.
* 마치 220V 전원 110V 전원으로 개조시키는 것을 비유.
* '이미 제공된 API'와 '필요한 API' 사이의 '차이'를 없애주는 Design Pattern.
* 기존에 제공된 API를 수정하지 않고 필요한 API에 맞추려는 Design Pattern.
* 구 버전과의 호환성
* 다른 용도로 감싸기때문에 'Wrapper' Pattern이라고도 불림.
{{tag>Architecture Modeling Design_Pattern Structural}}
= 상속을 이용한 구현 =
== 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");
}
}