목차

  1. 개요
  2. 요약
  3. 문제상황
  4. 파사드 패턴을 통한 해결
  5. 최소 지식 원칙
  6. 결론

개요

본 글은 head first design patterns 책을 읽고 정리한 글입니다.

파사드 패턴복잡한 서브시스템을 간단하게 제공하는 패턴입니다. 이는 간단한 인터페이스를 통해 까다로운 구현을 숨기고 사용자가 쉽게 사용할 수 있게 합니다. 이는 복잡성을 감소시키고 유지보수성을 높일 수 있습니다.

head first design patterns는 이에 대한 예시로 홈시어터를 가져옵니다. 홈시어터는 DVD 플레이어, 음향 시스템, 프로젝터 등으로 이루어져 있습니다.

만약 홈시어터에서 영화 한 편을 보기 위해 각각의 기기들을 하나하나 동작 순서부터 시작해서, 동작시키는 방법까지 알아야 한다면 사용자는 매번 영화를 보기 위해 많은 시간을 소비해야 합니다. 그러다보면 그냥 영화를 안 보고 말게 될 수도 있습니다.

이때 파사드 패턴을 사용하면 사용자는 간단한 인터페이스를 통해 영화를 볼 수 있습니다. 소위 버튼 하나만 딸깍 누르면 영화가 시작되는 것과 같습니다.

최소 지식 원칙객체 사이의 상호작용최소화한다는 원칙입니다. 이는 시스템을 디자인 할 때 상호작용 클래스의 수상호작용 방식에 주의를 기울여야 한다는 뜻입니다.


요약

  1. 파사드 패턴은 복잡한 서브시스템을 단순한 인터페이스로 제공합니다.
  2. 복잡성을 감소시키고 유지보수성을 높일 수 있습니다.
  3. 딸깍 - 파사드, DVD 플레이어/음향 시스템/프로젝터 - 서브시스템
  4. 파사드는 클라이언트와 구성 요소로 이루어진 서브시스템을 분리합니다.
  5. 파사드는 여러 클래스를 하나로 감싸서 사용할 수 있습니다.
  6. 최소 지식 원칙은 객체 사이의 상호작용을 최소화한다는 원칙입니다.

문제상황

한 영화광이 자신의 꿈이었던 자기만의 홈 시어터를 마침내 구축했습니다. 그런데 막상 꿈이 현실이 되고 보니, 그렇게 행복할 줄만 알았던 영화 생활은 녹록치 않았습니다.

영화를 볼 때마다 각각의 기기들을 하나하나 동작 순서부터 시작해서, 동작시키는 방법까지 알아야 하고, 심지어 동작하지 않은 것이 있으면 그것을 해결해야 했습니다. 이러다보니 영화를 보는 것이 귀찮아지고, 결국 홈 시어터를 사용하지 않게 되었습니다.

이런 상황을 코드로 나타내면 다음과 같습니다.

public class DvdPlayer {
    // DvdPlayer의 동작을 위한 메소드들
}

public class Amplifier {
    // Amplifier의 동작을 위한 메소드들
}

public class Projector {
    // Projector의 동작을 위한 메소드들
}

...

public static void main(String[] args) {

    Client client = new Client();

    DvdPlayer dvdPlayer = new DvdPlayer();
    Amplifier amplifier = new Amplifier();
    Projector projector = new Projector();
    // ...
    dvdPlayer.on();
    amplifier.on();
    projector.on();
    // ...
}

평생의 숙원이었던 홈 시어터를 포기할 수는 없기 때문에 해결하기 위한 방법을 강구하던 중 이에 대한 해결방법에 대한 제안을 듣게 되었습니다.


파사드 패턴을 통한 해결

파사드 패턴을 사용하면 사용자는 간단한 인터페이스를 통해 영화를 볼 수 있습니다. 버튼 하나만 딸깍 누르면 영화를 투영할 스크린은 내려오고, 창문을 가리는 커튼이 닫히고, DVD 플레이어가 켜지고, 음향 시스템이 켜지고, 프로젝터가 켜지는 것과 같습니다.

이를 코드로 나타내면 다음과 같습니다.

public class HomeTheaterFacade {
    DvdPlayer dvdPlayer;
    Amplifier amplifier;
    Projector projector;
    // ...

    public HomeTheaterFacade(DvdPlayer dvdPlayer, Amplifier amplifier, Projector projector, ...) {
        this.dvdPlayer = dvdPlayer;
        this.amplifier = amplifier;
        this.projector = projector;
        // ...
    }

    public void watchMovie() {
        dvdPlayer.on();
        amplifier.on();
        projector.on();
        // ...
    }
}

파사드 패턴을 사용하면 사용자는 간단한 인터페이스를 통해 영화를 볼 수 있습니다. 이를 통해 클라이언트와 구성요소로 이루어진 서브시스템을 분리하고, 여러 클래스를 하나로 감싸서 사용할 수 있습니다.


최소 지식 원칙

최소 지식 원칙객체 사이의 상호작용을 최소화한다는 원칙입니다. 이는 시스템을 디자인 할 때 상호작용하는 클래스의 수상호작용 방식에 주의를 기울여야 한다는 뜻입니다.

최소 지식 원칙을 따르는 4개의 가이드라인은 다음과 같습니다.

  1. 객체 자체
  2. 메소드에 매개변수로 전달된 객매
  3. 메소드를 생성하거나 인스턴스를 만든 객체
  4. 객체에 속하는 구성 요소

만이 객체와 상호작용을 하도록 한다.


결론

파사드 패턴은 복잡한 서브시스템을 간단한 인터페이스로 제공합니다. 이를 통해 복잡성을 감소시키고 유지보수성을 높일 수 있습니다.

홈 시어터의 예시를 통해 설명하면 이는 사용자가 버튼 하나를 딸깍하는 것만으로 영화를 볼 수 있게 되는 것과 같습니다. 파사드 패턴이 없었다면 사용자는 각각의 기기들을 하나하나 동작 순서부터 시작해서, 동작시키는 방법과 같은 수많은 복잡한 과정을 알아야 했을 것입니다.

이런 것을 통해 파사드 패턴이 가지고 있는 두 가지 역할을 알 수 있습니다. 하나는 클라이언트와 구성요소로 이루어진 서브시스템을 분리하는 것이고, 나머지 하나는 여러 클래스를 하나의 인터페이스로 감싸서 사용할 수 있게 하는 것입니다.

최소 지식 원칙을 따르는 것은 객체 사이의 상호작용을 최소화한다는 원칙입니다. 이는 시스템을 디자인 할 때 상호작용하는 클래스의 수상호작용 방식에 주의를 기울여야 한다는 뜻입니다.


2024-02-19
다음 글: 템플릿 메소드 패턴 → 카테고리로 돌아가기 ↩