목차
- 개요
- 요약
- 문제상황
- 파사드 패턴을 통한 해결
- 최소 지식 원칙
- 결론
개요
본 글은 head first design patterns 책을 읽고 정리한 글입니다.
파사드 패턴은 복잡한 서브시스템을 간단하게 제공하는 패턴입니다. 이는 간단한 인터페이스를 통해 까다로운 구현을 숨기고 사용자가 쉽게 사용할 수 있게 합니다. 이는 복잡성을 감소시키고 유지보수성을 높일 수 있습니다.
head first design patterns는 이에 대한 예시로 홈시어터를 가져옵니다. 홈시어터는 DVD 플레이어, 음향 시스템, 프로젝터 등으로 이루어져 있습니다.
만약 홈시어터에서 영화 한 편을 보기 위해 각각의 기기들을 하나하나 동작 순서부터 시작해서, 동작시키는 방법까지 알아야 한다면 사용자는 매번 영화를 보기 위해 많은 시간을 소비해야 합니다. 그러다보면 그냥 영화를 안 보고 말게 될 수도 있습니다.
이때 파사드 패턴을 사용하면 사용자는 간단한 인터페이스를 통해 영화를 볼 수 있습니다. 소위 버튼 하나만 딸깍 누르면 영화가 시작되는 것과 같습니다.
최소 지식 원칙은 객체 사이의 상호작용을 최소화한다는 원칙입니다. 이는 시스템을 디자인 할 때 상호작용 클래스의 수와 상호작용 방식에 주의를 기울여야 한다는 뜻입니다.
요약
- 파사드 패턴은 복잡한 서브시스템을 단순한 인터페이스로 제공합니다.
- 복잡성을 감소시키고 유지보수성을 높일 수 있습니다.
- 딸깍 - 파사드, DVD 플레이어/음향 시스템/프로젝터 - 서브시스템
- 파사드는 클라이언트와 구성 요소로 이루어진 서브시스템을 분리합니다.
- 파사드는 여러 클래스를 하나로 감싸서 사용할 수 있습니다.
- 최소 지식 원칙은 객체 사이의 상호작용을 최소화한다는 원칙입니다.
문제상황
한 영화광이 자신의 꿈이었던 자기만의 홈 시어터를 마침내 구축했습니다. 그런데 막상 꿈이 현실이 되고 보니, 그렇게 행복할 줄만 알았던 영화 생활은 녹록치 않았습니다.
영화를 볼 때마다 각각의 기기들을 하나하나 동작 순서부터 시작해서, 동작시키는 방법까지 알아야 하고, 심지어 동작하지 않은 것이 있으면 그것을 해결해야 했습니다. 이러다보니 영화를 보는 것이 귀찮아지고, 결국 홈 시어터를 사용하지 않게 되었습니다.
이런 상황을 코드로 나타내면 다음과 같습니다.
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개의 가이드라인은 다음과 같습니다.
- 객체 자체
- 메소드에 매개변수로 전달된 객매
- 메소드를 생성하거나 인스턴스를 만든 객체
- 객체에 속하는 구성 요소
만이 객체와 상호작용을 하도록 한다.
결론
파사드 패턴은 복잡한 서브시스템을 간단한 인터페이스로 제공합니다. 이를 통해 복잡성을 감소시키고 유지보수성을 높일 수 있습니다.
홈 시어터의 예시를 통해 설명하면 이는 사용자가 버튼 하나를 딸깍하는 것만으로 영화를 볼 수 있게 되는 것과 같습니다. 파사드 패턴이 없었다면 사용자는 각각의 기기들을 하나하나 동작 순서부터 시작해서, 동작시키는 방법과 같은 수많은 복잡한 과정을 알아야 했을 것입니다.
이런 것을 통해 파사드 패턴이 가지고 있는 두 가지 역할을 알 수 있습니다. 하나는 클라이언트와 구성요소로 이루어진 서브시스템을 분리하는 것이고, 나머지 하나는 여러 클래스를 하나의 인터페이스로 감싸서 사용할 수 있게 하는 것입니다.
최소 지식 원칙을 따르는 것은 객체 사이의 상호작용을 최소화한다는 원칙입니다. 이는 시스템을 디자인 할 때 상호작용하는 클래스의 수와 상호작용 방식에 주의를 기울여야 한다는 뜻입니다.