만들어가는 세상

[JAVA] 파사드 패턴 (facade pattern) 개념 본문

IT/JAVA

[JAVA] 파사드 패턴 (facade pattern) 개념

윤재웅 2020. 4. 17. 00:32

파사드 패턴(facade pattern) 개념

Gof 서적에 따르면 Facade 패턴은 "하위 시스템을 보다 쉽게 사용할 수 있게 해주는 고급 인터페이스를 정의한다." 라고 되어 있습니다. Facade 패턴은 어댑터 패턴과 거의 같은 방식으로 작동하지만 서로 다른 목적을 가지고 있습니다.

  • Adapter 패턴은 원래 코드를 다른 코드와 작동할 수 있는 래퍼를 제공한다.
  • Facade 패턴은 원래 코드를 더 쉽게 처리 할 수 있는 래퍼를 제공한다.
사용 예 :
  • 캡슐화되지 않은 코드를 처리 할때 Facade 패턴을 사용한다.
  • 원하는 코드를 다시 작성할 수 없을 때 일반적으로 Facade 패턴을 사용한다.
    Facade를 사용하면 문제를 해결할 수 있지만 기본 코드가 변경되면 Facade 패턴도 변경해야 한다.

이제 코드로 확인해봅니다.

여러 클래스의 복잡한 실행 단위를 파사드 클래스에서 정의합니다.
컴퓨터,라디어,불을 킬때 하나하나 호출하는것이 아니라 홈 클래스에서 단위를 묶어서 원버튼으로 클릭 합니다.

public class Computer {
    private boolean turnedOn = false;

    public void turnOn() {
        turnedOn = true;
        System.out.println("컴퓨터를 킨다.");
    }
    public void turnOff() {
        turnedOn = false;
        System.out.println("컴퓨터를 끈다.");
    }
    public boolean isTurnedOn() {
        return turnedOn;
    }
}
public class Light {
    private boolean turnedOn = false;

    public void turnOn() {
        turnedOn = true;
        System.out.println("불을 킨다.");
    }
    public void turnOff() {
        turnedOn = false;
        System.out.println("불을 끈다.");
    }
    public boolean isTurnedOn() {
        return turnedOn;
    }
}
public class Radio {
    private boolean turnedOn = false;

    public void turnOn() {
        turnedOn = true;
        System.out.println("라디오를 킨다.");
    }
    public void turnOff() {
        turnedOn = false;
        System.out.println("라디오를 끈다.");
    }
    public boolean isTurnedOn() {
        return turnedOn;
    }
}

여기가 핵심 입니다. 생성자에 컴퓨터, 불, 라디오 등 객체의 그릇을 담아서 하나의 메소드로 통합? 합니다. 함수 단위를 묶은 샘 입니다.

public class HomeFacade {
    private Computer computer;
    private Light light;
    private Radio radio;

    public HomeFacade(Computer computer, Light light, Radio radio) {
        this.computer = computer;
        this.light = light;
        this.radio = radio;
    }
    public void homeIn() {
        System.out.println("집에 오면 컴퓨터 켜고, 라디오 켜고, 불 켜기.");
        if (!computer.isTurnedOn()) {
            computer.turnOn();
        }
        if (!light.isTurnedOn()) {
            light.turnOn();
        }
        if (!radio.isTurnedOn()) {
            radio.turnOn();
        }
    }
    public void homeOut() {
        System.out.println("컴퓨터 끄고, 라디오 끄고, 불 끄고 외출하기.");
        if (computer.isTurnedOn()) {
            computer.turnOff();
        }
        if (light.isTurnedOn()) {
            light.turnOff();
        }
        if (radio.isTurnedOn()) {
            radio.turnOff();
        }
    }
}
public class TestPattern {

    public static void main(String[] args) {

        Computer computer = new Computer();
        Light light = new Light();
        Radio radio = new Radio();

        // 이전 사용 방식
        System.out.println("========집에 나갈때 파사드 적용 전==========");
        computer.turnOff();
        light.turnOff();
        radio.turnOff();

        System.out.println("========집에 들어올때 파사드 적용 후==========");
        // 파사드 패턴 적용 후 사용 방식
        HomeFacade home = new HomeFacade(computer, light, radio);
        home.homeIn();
    }
}

결과

클래스다이어그램을 확인해보겠습니다.

간단하게 파사드 패턴(facade pattern)에 대해서 알아보았습니다.

Comments