반응형
어댑터
다른 전기나 기계 장치를 서로 연결해서 작동할 수 있도록 만들어 주는 도구
어댑터 패턴
클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴
호환성이 없는 인터페이스를 함께 동작할 수 있도록 만들어 준다.
또한 기존 클래스의 소스코드를 수정하지 않고 기존 인터페이스에 맞춰서 동작이 가능하도록 한다는 장점이 있다.
객체 어댑터
class CardObjectAdapter implements Card{
TrafficCard trafficCard;
public CardObjectAdapter(TrafficCard trafficCard){
this.trafficCard = trafficCard;
}
@Override
public void pay() {
trafficCard.trafficPay();
}
}
컴포지션을 사용하며, 클래스와 인터페이스 모두 wrapping 할 수 있다.
어댑터를 사용하여 연결할 클래스를 Adaptee라고 했을때, 객체 어댑터는 Adaptee 클래스를 내부 객체로 생성하여 연결한다.
장점
- 다양한 서브 클래스 구성을 가질 수 있다.
단점
- 객체의 인스턴스를 생성해야 한다.
클래스 어댑터
class CardClassAdapter extends TrafficCard implements Card{
@Override
public void pay() {
this.trafficPay();
}
}
상속을 사용하여 클래스를 wrapping한다.
Adaptee를 객체를 생성하는 방법이 아닌 상속을 통해 연결한다.
장점
- 객체의 인스턴스를 생성하지 않고 오버라이드가 가능하다.
단점
- 다중 상속이 불가능 하다.
전체 코드
public class Adapter {
public static void main(String[] args){
CardClassAdapter classAdapter = new CardClassAdapter();
classAdapter.pay();
CardObjectAdapter objectAdapter = new CardObjectAdapter(new TrafficCard());
objectAdapter.pay();
}
}
interface Card{
void pay();
}
class TrafficCard{
public void trafficPay() {
System.out.println("Traffic Card Pay");
}
}
class CardObjectAdapter implements Card{
TrafficCard trafficCard;
public CardObjectAdapter(TrafficCard trafficCard){
this.trafficCard = trafficCard;
}
@Override
public void pay() {
trafficCard.trafficPay();
}
}
class CardClassAdapter extends TrafficCard implements Card{
@Override
public void pay() {
this.trafficPay();
}
}
참고
https://invincibletyphoon.tistory.com/20
https://gogetem.tistory.com/221
https://en.wikipedia.org/wiki/Adapter_pattern
반응형
'Clean Code' 카테고리의 다른 글
[Design Pattern] 구조 패턴 - 퍼사드 패턴 (0) | 2022.03.14 |
---|---|
[Design Pattern] 구조 패턴 - 브리지 패턴 (0) | 2022.03.12 |
[Design Pattern] 구조 패턴 - 컴포지트 패턴 (0) | 2022.03.06 |
[Design Pattern] 구조 패턴 - 데코레이터 패턴 (0) | 2022.03.03 |
[Design Pattern] 생성 패턴 - 싱글톤 패턴 (0) | 2022.03.03 |