09. 퍼사드 패턴

AlmondGood·2022년 7월 22일
0

디자인패턴

목록 보기
10/16

퍼사드 패턴(Facade Pattern)

퍼사드(Facade) : 건물의 정면 또는, 외관을 뜻함.

퍼사드 패턴이란, 서브시스템에 있는 일련의 인터페이스를 통합 인터페이스로 묶어주는 패턴입니다.

에를 들어, 핸드폰을 킨다 라는 동작을 하는데 일어나는 일련의 과정을 보겠습니다.

사용자 전원 버튼 press


핸드폰(안드로이드)
https://secmem.tistory.com/88

그림만 봐도 머리가 아파오네요...

사용자는 저런 과정들을 알 필요가 없습니다.
여기서 전원 버튼통합 인터페이스이고, 부팅 과정서브시스템의 일부가 되는 것입니다.



퍼사드 패턴 구현

위의 그림을 예제로 퍼사드 패턴을 간략하게 구현해 보겠습니다.
내부 구현은 생략하겠습니다.

// 부팅하는 데 필요한 클래스들 입니다.
class BootLoader{
    ...
}
class AndroidKernel{
    ...
}
class Daemon {
    ...
}
class Zygote {
    ...
} 

버튼 없이 클래스들만 서브시스템만 주어진다면, 사용자는 부팅을 위해 이곳저곳 클래스를 돌아다니며 메소드를 알맞은 순서대로 호출해 주어야할 것입니다.

부팅 한번 하는데 너무 많은 리소스가 소모되죠.



이를 묶어주는 것이 퍼사드 패턴입니다.
부팅에 필요한 클래스와 메소드만 묶어, 단순화하여 표현합니다.

// 퍼사드 클래스
class Phone {
    BootLoader bootLoader;
    AndroidKernel androidKernel;
    Daemon daemon;
    Zygote zygote;
         ...
    // 구성 요소들
 
    Phone(BootLoader bootLoader,  AndroidKernel androidKernel, Daemon daemon, 
    							Zygote zygote, ...){
    
        this.bootLoader = bootLoader;
        this.androidKernel = androidKernel;
        this.daemon = daemon;
        this.zygote = zygote;
        	...
    }
 
  	// 단순화한 표현
    void pressPowerButton() {
        bootLoader.run();
        androidKernel.init();
        daemon.run();
        zygote.run();
		   ...

        System.out.println("Hello World!");
    }
}

부팅하는 데 필요한 메소드만 모아서 pressPowerButton() 이라는 메소드 안에 담아 간략화 했습니다.



메인 함수입니다.

public static void main(String[] args) {
        BootLoader bootLoader = new BootLoader();
        AndroidKernel androidKernel = new AndroidKernel();
        Daemon daemon = new Daemon();
        Zygote zygote = new Zygote();
        			...
        // 구성 요소 초기화
        // 실제 프로젝트를 진행할 때는 사용자가 직접 초기화하지 않아도 될 겁니다.


        Phone phone = new Phone(bootLoader, androidKernel, daemon, zygote);

        phone.pressPowerButton(); // "Hello World!"
}

사용자는 별 다른 동작할 것 없이 phone 객체를 생성한 뒤, 전원 버튼을 누르는 동작만 해주었습니다.
그랬더니 핸드폰이 켜졌습니다.

건물을 밖에서 볼 때는 외관만 보일 뿐 내부까지 자세하게 볼 수는 없죠.

마찬가지로 동작 실행을 위해 복잡한 서브시스템의 내부를 알 필요 없이
필요한 클래스만 퍼사드 클래스에 넣어 단순화하면 더 편리하게 사용할 수 있습니다.



퍼사드 패턴의 장단점

장점

  • 서브시스템 간의 결합도를 낮출 수 있습니다.
  • 사용자가 서브시스템을 사용할 때 다뤄야 할 객체의 수를 줄여줍니다.
  • 사용자 입장에서 코드가 간결합니다.

단점

  • 사용자에게 내부 서브시스템까지 숨길 수 없습니다.
  • 사용자가 서브시스템의 내부 클래스를 직접 사용하는 걸 막을 수 없습니다.

https://jhtop0419.tistory.com/109



최소 지식 원칙(Principle of Least Knowledge)

데메테르의 법칙(The Law of Demeter)이라고도 불리는 이 원칙은,
객체 사이의 결합도를 낮추기 위한 몇 가지 방법을 제시합니다.

여기 객체 A와 메소드 method(Object obj)가 있습니다.
아래는 method(Object obj)호출해도 되는 메소드들입니다.

    1.  객체 A의 메소드
    1.  매개변수로 전달된 객체
    1.  method(Object obj) 내부에서 생성된 객체
  • 4.  객체 A의 구성 요소의 메소드

차의 시동을 걸 때로 예시를 들어보겠습니다.

class Car {
    Engine engine; 
    	...
   	// 객체 A의 구성 요소
   
    public void start(Key key) {
    	// 메소드 내부에서 객체 생성
        Doors doors = new Doors();  
   
        boolean authorized = key.turns(); // 2번 원칙

        if (authorized) {
            engine.start(); 		// 4번 원칙
            navigationDisplay(); 	// 1번 원칙
            doors.lock(); 			// 3번 원칙
        }
			...
    }

    public void navigationDisplay() {
        		...
    }
}

원칙을 지키면 객체끼리 정보를 직접 주고받지 않고 결합도를 낮출 수 있습니다.


참고 자료

https://rjswn0315.tistory.com/47

https://jhtop0419.tistory.com/109

profile
Zero-Base to Solid-Base

0개의 댓글