-
[구조 패턴] AdapterCS/디자인패턴 2021. 5. 26. 17:00
1. Adapter 란?
해외 전자제품을 국내에서 사용하기 위해서 일명 "돼지코"라 불리는 변환 플러그를 사용해야 하는 경우가 있다. 국가마다 콘센트의 형태, 전압 등이 다르기 때문이다.
마찬가지로 서로 맞지 않는 인터페이스를 갖는 클래스가 있을때, 이 둘의 인터페이스를 맞춰주기 위해서 사용하는 패턴이 Adapter(어댑터) 패턴이다.
2. Structure
일반적인 구조는 아래와 같다.
Object Adapter Client에서 필요한 인터페이스를 정의한 Target이 있고, 이 Target을 구현한 Adapter가 Adaptee를 통해서 각 함수를 기능을 제공해주는 형식이다.
이와 유사하게 아래와 같은 구조를 생각해볼 수도 있다. 단, 이와 같은 구조를 위해서는 언어에서 다중 상속을 지원해야하기 때문에 C++같은 언어에서만 만들 수 있는 구조임에 주의해야 한다.
Class Adapter 3. Example
E-Commerce 시스템에서 결재 기능에 대해서 생각해보자. 결재 기능을 제공해주는 몇몇 써드 파티 API들이 있을 것이다. 이중에서 최초 개발시에 A라는 써드파티를 이용했다고 가정해보자.
public interface A_PaymentSystem { public String getCreditCardNo(); public String getCardOwnerName(); public String getCardExpMonth(); public String getCardExpYear(); public Double getAmount(); public void setCreditCardNo(String creditCardNo); public void getCardOwnerName(String ownerName); public void setCardExpMonth(String expMonth); public void setCardExpYear(String expYear); public void setAmount(Double amount); } public class A_Payment implements A_PaymentSystem { ... }
이 같은 A 결재 시스템의 인터페이스를 사용하여 E-Commerce 시스템을 개발하고, 서비스하는 와중에 다른 결재 시스템인 B로 변경해야하는 상황이 발생했다.
여기서 문제는 B는 A와 다른 인터페이스를 지원한다는 것이다. 두 인터페이스를 살펴보면, 이름만 다를 뿐 두 시스템이 원하는 정보가 유사하다는 것을 알 수 있다.
public interface B_PaymentSystem { public String getCreditCardNo(); public String getCustomerName(); public String getCardExpDate(); public Double getAmount(); public void setCreditCardNo(String creditCardNo); public void setCustomerName(String customerName); public void setCardExpDate(String expDate); public void setAmount(Double amount); }
기존의 코드를 변경하는 대신 A를 이용해서 B 객체를 생성하도록 코드를 추가해보자.
public class Adapter_AtoB implements B_PaymentSystem { // ... other variables private final A_payment ap; public Adapter_AtoB(A_payment ap) { this.ap = ap; setProps(); } public void setProps() { setCreditCardNo(this.ap.getCreditCardNo()); setCustomerName(this.ap.getCardOwnerName()); setCardExpDate(this.ap.getExpDate + '/' + this.ap.getExpYear()); setAmount(this.ap.getAmount()); } // Overrided Methods... }
이 클래스를 사용하면, Client는 기존 A 인스턴스의 인터페이스를 활용하여 B 인스턴스를 생성할 수 있게 된다는 장점이 있다.
References
- Rohit Joshi. 2015. "Java Design Pattern". Java Code Geek (https://www.javacodegeeks.com/2015/09/adapter-design-pattern.html)
- https://refactoring.guru/design-patterns/adapter. accessed 2021.05.26
'CS > 디자인패턴' 카테고리의 다른 글
[구조 패턴] Bridge (0) 2021.06.03 [생성 패턴] Singleton (0) 2021.05.25 [생성 패턴] Builder (0) 2021.05.21 [생성 패턴] Prototype (0) 2021.05.20 [생성 패턴] Abstract Factory Method (0) 2021.05.19