상위문서: GoF 디자인 패턴
어댑터 패턴은 이름대로 어댑터처럼 사용되는 패턴이다.
콘센트 규격이 다른 나라에 여행을 가거나 방문을 하면 꼭 사용해야 되는 것이 어댑터이다. 어댑터를 사용하면 110V 를 쓰는곳에 가서도 그대로 쓸 수 있다. 이처럼, 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 해주는 패턴이 어댑터 패턴이라고 할 수 있겠다. 이를 위해 어댑터 역할을 하는 클래스를 새로 만들어야 한다.
기존 클래스의 명세(사양)을 바꾸지 않고 새로운 클래스를 작성해서 관리하는 방법을 쓸 때 사용하기도 한다.
위 그림과 같이 구현방식은 Adapter class를 통해 관계가 없는 인터페이스들이 연계되서 사용될 수 있도록 한다.
public interface Plugin {
public void connect();
public void disconnect();
}
public class Plugin110V implements Plugin {
@Override
public void connect() {
System.out.println("110V connect");
}
@Override
public void disconnect() {
System.out.println("110V disconnect");
}
}
현재는 110v만 얻을 수 있다.
그런데 220v를 사용하려고 하는데 어떻게 해야 되는가?
먼저 adapter class를 만든다.
public interface PluginAdapter {
public void connect();
public void disconnect();
}
실제로 interface를 구현할 때는 2가지 방식으로 사용할 수 있다.
차이는 참조할 class를 상속받아 사용하느냐 직접 인스턴스를 선언해서 사용하느냐 이다.
주로 사용되는 object adpater implementation을 살펴본다.
//object adpater implementation
public class Adapter220V implements PluginAdapter {
private Plugin plugin;
public Adapter220V(Plugin plugin) {
this.plugin=plugin;
}
@Override
public void connect() {
System.out.println("220V->110V convert");
this.plugin.connect();
}
@Override
public void disconnect() {
System.out.println("220V->110V convert");
this.plugin.disconnect();
}
}
//main
public class AdapterMain {
public static void main(String[] args) {
PluginAdapter plugin = new Adapter220V(new Plugin110V());
plugin.connect();
plugin.disconnect();
}
}
//result
//220V->110V convert
//110V connect
//220V->110V convert
//110V disconnect