개발
home
🚪

[디자인 패턴] 퍼사드 패턴

Created
2022/03/29
Tags
Design Pattern
Facade Pattern
2022-03-29 @이영훈

퍼사드(Facade) 패턴

한 서브 시스템 내의 인터페이스 집합에 대한 획일화된 하나의 인터페이스를 제공하는 패턴으로, 서브 시스템을 사용하기 쉽도록 상위 수준의 인터페이스를 정의합니다.
*facade: 건물의 정면

자동차 직진 예시

자동차가 직진하려면 간략화해서 다음의 4단계를 거친다고 가정합니다.
압력센서(가속패달)에 전원을 연결하고
모터에 전원을 연결하고
압력센서(가속패달)를 활성화시키고
마지막으로 모터를 회전시킵니다.
그렇지만 현실에서는 자동차 가속패달만 밟으면 앞으로 직진합니다. 퍼사드 패턴의 쉬운 비유입니다. 내부 시스템을 숨기고 사용자에게 인터페이스를 제공합니다.

자동차 예시 구현하기

자동차라는 퍼사드가 있고 자동차 퍼사드가 내부 시스템을 호출합니다. 그리고 외부에서 호출할 수 있는 인터페이스를 만듭니다.
자동차 퍼사드입니다. 외부 인터페이스 goForward 를 만들고 용용자는 내부 시스템을 몰라도 동작할 수 있게 합니다.
public class CarFacade { public void goForward() { Battery battery = new Battery(); Motor motor = new Motor(); PressureSensor pressureSensor = new PressureSensor(); battery.givePower(pressureSensor); battery.givePower(motor); pressureSensor.activate(); motor.rotate(); System.out.println("🚗 Car goes forward"); } }
Java
복사
내부 시스템(자동차 내부의 핵심 기기)의 인터페이스입니다.
public interface Component { public String getName(); }
Java
복사
내부 시스템 중 배터리 구현입니다.
public class Battery implements Component { public Battery() { } @Override public String getName() { return "Battery"; } public void givePower(Component component) { System.out.println("giving power to " + component.getName()); } }
Java
복사
내부 시스템 중 모터 구현입니다.
public class Motor implements Component { public Motor() { } @Override public String getName() { return "Motor"; } public void rotate() { System.out.println("Motor is rotating"); } }
Java
복사
내부 시스템 중 압력센서(가속패달) 구현입니다.
public class PressureSensor implements Component { public PressureSensor() { } @Override public String getName() { return "Pressure Sensor"; } public void activate() { System.out.println("Pressure sensor is activated"); } }
Java
복사

자동차 예시 호출

public class FacadeApplication { public static void main(String[] args) { // A driver wants to go forward (without facade) /* * 1. 압력센서(가속패달)에 전원을 연결한다 * 2. 모터에 전원을 연결한다 * 3. 압력센서(가속패달)를 활성화시킨다 * 4. 모터에게 회전 명령을 내린다. * */ // 👊 문제점(불편한 점) // 1. 앞으로 가기 위해서 매번 긴~~ 코드를 작성해야함 // 2. 내부 함수와 내부 구조를 알아야 코딩이 가능하다 // 🙊 앞으로 가는 명령만 내리고 싶고 내부 구현은 궁금하지 않다 // 그래서 Facade 패턴을 사용해서 자동차를 앞으로 가도록 한다. (facade: 건물의 정면) CarFacade carFacade = new CarFacade(); carFacade.goForward(); } }
Java
복사

퍼사드 패턴의 이점

1.
서브 시스템의 구성 요소를 보호할 수 있습니다. 사용자가 다루어야할 객체의 수가 줄어들며, 서브 시스템을 쉽게 사용할 수 있습니다.
2.
서브 시스템과 사용자 코드 간의 결합도를 더욱 약하게(decoupling) 만듭니다. 서브 시스템과 사용자 간의 결합이 약하면, 서브 시스템 내의 요소를 다양화하는 작업을 원활하게 할 수 있습니다.