본문 바로가기

책/헤드퍼스트 디자인패턴

Chapter 07 어댑터(Adapter)패턴과 파사드(Facade)패턴

어댑터 패턴

어댑터 패턴의 정의

- 어댑터 패턴은 특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이스로 변환합니다. 인터페이스가 호환되지 않아 같이 쓸 수 없었던 클래스를 사용할 수 있게 도와줍니다.

 

쉽게 말해 어댑터 패턴은 서로 맞물릴 수 없는 두개의 클래스나 인터페이스 사이에 중간 인터페이스(Adapter)를 하나 만들어서 둘이 이어질 수 있게 만들어준다.

 

어댑터 패턴의 구조는

 

Client -> Target(Interface)

                     |

               Adapter(Target 구현) -> Adaptee(Target에 끼우고 싶은 클래스) 

 

Target 인터페이스와 구현체인 Adapter 그리고 끼워지는? Adaptee로 구성되어 있다.

 

Adatpter 구현체는 Target의 메서드를 Override하고 그 안에 Adaptee의 메소드를 실행한다. 이렇게 연결을 시켜줄 수 있다. 정말 끼운다는 표현이 직관적으로 이해되는 코드이다.

 

 

어탭터 패턴의 종류 - 객체어댑터 vs 클래스어댑터

 

가장 큰 차이점은 클래스 어댑터는 다중 상속(A와 B를 동시에 상속받는 C)이 가능할 떄 사용할 수 있다. 자바는 다중 상속이 불가능해서 객체어댑터를 사용한다. 특정 어댑티 클래스에만 적용할 수 있다. 클래스 어댑터의 장점은 중간에 인터페이스를 만들 필요 없이 어댑터가 어댑티를 바로 필요로하는 타겟에 연결해 줄 수 있다는 점이다. 어떤 어댑터를 사용할지는 사용자의 선택에 달린 것 같다.

 

 

파사드 패턴

파사드 패턴의 정의

- 파사드 패턴은 서브시스템에 있는 일련의 인터페이스를 통합 인터페이스로 묶어 줍니다. 또한 고수준 인터페이스도 정의하므로 서브시스템을 더 편리하게 사용할 수 있습니다.

 

우리가 흔히 사용하는 배달 어플에서 메뉴들이 모두 고르고 주문하기 버튼을 누른다는 상황을 생각해보자.

그 안에 어떤 과정들이 생략되어 있을까?

간략하게

"가게에 주문서가 송신된다."  "사장님이 요리를 만든다. "요리가 만들어지면 배달자가 배달을 할 수 있도록 주소 영수증이 출력된다.", "배달자에게 영수증이 송신된다." 같은 과정들이 생략되어 있을 것이다. 고객은 이런 세부적인 과정을 알필요 없이 주문하기 버튼만 누르면 된다.

 

파사드는 조금 더 많은 일을 하지만 하나의 총괄 인터페이스를 만들어서 여러가지 메서드들을 간편하게 실행할 수 있도록 만들어주는 역할을 한다. 

 

 

왜 파사드 패턴이 나왔나?

 

파사드 패턴은 디자인 원칙 중 최소 지식 원칙을 지키기 위해 나왔다. 

최소지식원칙은 객체간 상호작용을 가까운 객체와만 진행하여 전체 디자인이 복잡하게 얽히지 않도록 하는 원칙이라고 볼 수 있다. 따라서 설계를 잘해야 된다(?)

 

느낀점

 

이전에 항해99 플러스 백엔드 코스를 진행할 때, e-commerce 를 간단하게 구현하고 파사드 패턴을 이용했었다. 그때 느꼈던 점은 파사드 패턴은 약간 유저 인터페이스 성향을 띄고 있다고 생각했었는데, 이번에 책을 읽으며 좀 더 명확하게 알 수 있었다.