본문 바로가기
SW

GoF의 디자인 패턴(Design Patterns: Elements of Reusable Object-Oriented Software) - 4장 구조 패턴 :: 퍼사드(Facade)

by 라꾸스떼(YR) 2020. 4. 29.
반응형

[퍼사드(Facade) - 객체 구조]

<의도>

한 서브시스템 내의 인터페이스 집합에 대한 획일화된 하나의 인터페이스를 제공하는 패턴이다.

 

<동기>

서브시스템들 사이의 의사소통 및 종속성을 최소화하려는 것이다.

Compiler 클래스(퍼사드 객체) 사용자에게는 컴파일러 시스템을 사용하는 데 필요한 가장 필수적인 인터페이스만을 제공하고, 내부적으로는 컴파일러 기능성을 구현하는 클래스들을 함께 동작하도록 묶어주는 역할도 수행한다.

 

<활용성>

-복잡한 서브시스템에 대한 단순한 인터페이스 제공이 필요할 때

-추상 개념에 대한 구현 클래스와 사용자 사이에 너무 많은 종속성이 존재할 때. 서브시스템에 정의된 모든 인터페이스가 공개되면 빈번한 메서드 호출이 있을 수 있으나, 이런 호출은 단순한 형태로 통합하여 제공하고 나머지 부분은 내부적으로 처리함으로써 사용자와 서브시스템 사이의 호출 횟수는 실질적으로 감소하게 되는 효과를 갖는다.

-서브시스템을 계층화시킬 때. 퍼사드 패턴을 사용하여 각 서브시스템의 계층에 대한 접근점을 제공한다.

 

<구조>

-

 

<참여자>

-퍼사드 : 단순하고 일관된 통합 인터페이스를 제공하며, 서브시스템을 구성하는 어떤 클래스가 어떤 요청을 처리해야 하는지 알고 있으며, 사용자의 요청을 해당 서브시스템 객체에 전달한다.

-서브시스템 클래스들 : 서브시스템의 기능을 구현하고, 퍼사드 객체로 할당된 작업을 실제로 처리하지만 퍼사드에 대한 아무런 정보가 없다.

 

<협력 방법>

-사용자는 퍼사드에 정의된 인터페이스를 이용해서 서브시스템과 상호작용한다. 퍼사드는 해당 요청을 서브시스템을 구성하는 적당한 객체에게 전달한다. 서브시스템을 구성하는 객체가 실제 요청 처리를 담당한다.

-퍼사드를 사용하는 사용자는 서브시스템을 구성하는 객체로 직접 접근하지 않아도 된다.

 

<결과>

1.서브시스템의 구성요소를 보호할 수 있다. 사용자가 다루어야 할 객체의 수가 줄어들며, 서브시스템을 쉽게 사용할 수 있다.

2.서브시스템과 사용자 코드 간의 결합도를 더욱 약하게 만든다. 서브시스템 내의 요소를 다양화하는 작업을 원활하게 할 수 있다.

3.응용프로그램 쪽에서 서브시스템 클래스를 사용하는 것을 완전히 막지는 않다.

 

<구현>

1.사용자와 서브시스템 간의 결합도 줄이기. 퍼사드를 추상 클래스로 정의하고, 서브시스템을 나타내기 위해 이를 상속하는 구체 서브클래스를 정의하여 다른 구현을 정의하도록 한다. 그러면 사용자는 퍼사드만 사용하기 때문에, 어떤 서브시스템의 구현이 사용되고 있는지 알 필요가 없게 된다.

2.서브시스템 클래스 중 공개할 것과 감출 것. 서브시스템은 클래스와 유사하다. 즉, 둘 다 인터페이스를 갖고 있으며 무엇인가를 감춘다. 클래스는 상태와 연산을, 서브시스템은 클래스를 캡슐화한다. 서브시스템의 공개 인터페이스는 사용자가 직접 접근할 수 있는 클래스들이고, 비공개 인터페이스는 서브시스템 자체가 된다. 퍼사드 클래스는 공개 인터페이스의 일부이다.

 

<예졔 코드>

-

 

<잘 알려진 사용예>

-

 

<관련 패턴>

추상 팩토리 패턴은 서브시스템에 독립적인 방법으로, 서브시스템 객체를 생성하는 인터페이스를 제공하기 위해 퍼사드와 함께 사용할 수 있다. 추상 팩토리는 퍼사드에 대한 대안으로서, 플랫폼에 종속적인 클래스를 감추는 데 쓴다.

중재자 패턴도 기존에 존재하는 클래스의 기능성을 추상화한다는 점에서 퍼사드 패턴과 비슷하다. 중재자 패턴에 참여하는 객체는 서로를 직접 알지 못하고 단지 중재자를 통해서만 상호작용이 된다. 이에 비해 퍼사드는 서브시스템 인터페이스 자체를 추상화하여 사용을 용이하게 하려는 목적을 갖는다.

퍼사드 객체가 하나만 있어도 된다면 단일체로 구현한다.

반응형

댓글