-
[Design Pattern] 어뎁터(Adapter) 패턴 - 디자인 패턴CSE/Design Pattern 2015. 6. 13. 10:36
Pattern #9 어뎁터 패턴
어플리케이션의 기능을 외부에서 필요한 형태로 수정하여 사용하도록 함
패턴 요약- 원하는 인터페이스를 추상 클래스로 정의- 이를 상속하는 어뎁터 클래스를 만들고 이를 요구하는 기능을 가진 클래스(adaptee)와 메시지를 교환하게 함동기당신은 금융권 전산화 시스템 개발팀의 일원으로, 통신보안 관련 쪽 개발을 맡았다. 개발 기간이 빠듯하긴 하지만 다행히 다른 프로젝트를 수행할 때 개발해 놓은 통신보안 코드들이 있어서 일정을 맞출 수 있을 것 같다. 그런데 한가지 문제점은, 예전 프로젝트 때 개발된 통신보안 코드들은 A사의 통신 보안 프로토콜 Library를 사용하는데 비하여, 새 프로젝트에서는 B사의 통신 보안 프로토콜 Library를 사용하도록 결정되었다. 재사용하려는 통신 보안 코드들을 전면적으로 수정하지 않고 A사의 Library를 B사의 Library로 대체할 수 있는 방법은 없을까??
일반적 접근 방법- 기존의 Client Code 내에서 A Library 부분을 모두 B Library로 대체하고, A Protocol객체의 함수 호출부분을 B Protocol객체의 함수 호출로 바꾼다.12345678910// 기존 Client Code#include “AProtocol.h”AProtocol proto;proto.connect(“xyz.com”,50);proto.send(msg);…proto.receive(msg);…proto.disconnect();cs 12345678910// 수정된 Client Code#include “BProtocol.h”BProtocol proto;proto.setTarget(“xyz.com”,50);proto.open();proto.write(msg);…proto.read(msg);…proto.close();cs 문제점- 기존 Client 코드 전체에 산재해 있는 A Library관련 코드를 모두 수정해야 한다.해결 방안- 기존 Client Code를 그대로 재사용하기 위해서 B Protocol 인터페이스를 A Protocol의 인터페이스로 변환하는 것이 필요하다.- B Protocol 코드를 직접 변경할 수는 없으므로, Client Code와 B Protocol 사이에 중재자 역할을 하는 새로운 클래스를 작성한다.구조
의도- 특정 클래스의 인터페이스를 클라이언트가 원하는 인터페이스로 변환한다.별명- Wrapper적용 분야- 기존에 존재하는 클래스를 재사용하고 싶지만, 원하는 인터페이스와 맞지 않을 때- 미리 정해져 있지 않은 클래스들과 상호 작용할 수 있는 재사용 가능 클래스를 만들려는 경우예제
Volt.java
12345678910111213141516171819package adapter;public class Volt {private int volts;public Volt(int volts) {this.volts = volts;}public int getVolts() {return volts;}public void setVolts(int volts) {this.volts = volts;}}cs Socket.java
123456789package adapter;public class Socket {public Volt getVolt() {return new Volt(120);}}cs SocketAdapter.java
1234567891011package adapter;public interface SocketAdapter {public Volt get120Volt();public Volt get12Volt();public Volt get3Volt();}cs SocketClassAdapterImpl.java
12345678910111213141516171819202122232425package adapter;public class SocketClassAdapterImpl extends Socket implements SocketAdapter {public Volt get120Volt() {return getVolt();}public Volt get12Volt() {Volt v = getVolt();return convertVolt(v, 10);}public Volt get3Volt() {Volt v = getVolt();return convertVolt(v, 40);}private Volt convertVolt(Volt v, int i) {return new Volt(v.getVolts() / i);}}cs SocketObjectAdapterImpl.java
123456789101112131415161718192021222324252627package adapter;public class SocketObjectAdapterImpl implements SocketAdapter {private Socket sock = new Socket();public Volt get120Volt() {return sock.getVolt();}public Volt get12Volt() {Volt v = sock.getVolt();return convertVolt(v, 10);}public Volt get3Volt() {Volt v = sock.getVolt();return convertVolt(v, 40);}private Volt convertVolt(Volt v, int i) {return new Volt(v.getVolts() / i);}}cs AdapterMain.java
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152package adapter;public class AdapterMain {public static void main(String[] args) {testClassAdapter();testObjectAdapter();}private static void testObjectAdapter() {SocketAdapter sockAdapter = new SocketObjectAdapterImpl();Volt v3 = getVolt(sockAdapter, 3);Volt v12 = getVolt(sockAdapter, 12);Volt v120 = getVolt(sockAdapter, 120);System.out.println("v3 volts using Object Adapter = " + v3.getVolts());System.out.println("v12 volts using Object Adapter = " + v12.getVolts());System.out.println("v120 volts using Object Adapter = "+ v120.getVolts());}private static void testClassAdapter() {SocketAdapter sockAdapter = new SocketClassAdapterImpl();Volt v3 = getVolt(sockAdapter, 3);Volt v12 = getVolt(sockAdapter, 12);Volt v120 = getVolt(sockAdapter, 120);System.out.println("v3 volts using Class Adapter = " + v3.getVolts());System.out.println("v12 volts using Class Adapter = " + v12.getVolts());System.out.println("v120 volts using Class Adapter = "+ v120.getVolts());}private static Volt getVolt(SocketAdapter sockAdapter, int i) {switch (i) {case 3:return sockAdapter.get3Volt();case 12:return sockAdapter.get12Volt();case 120:return sockAdapter.get120Volt();default:return sockAdapter.get120Volt();}}}cs 'CSE > Design Pattern' 카테고리의 다른 글
[Design Pattern] 플라이웨이트(Flyweight) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 브릿지(Bridge) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 프록시(Proxy) 패턴 (0) 2015.06.13 [Design Pattern] 컴포지트(Composite) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 데코레이터(Decorator) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 파써드(Facade) 패턴 (0) 2015.06.13