공부하고 기록하는, 경제학과 출신 개발자의 노트

학습일지/Language

[Design Pattern] Facade

inspirit941 2020. 12. 28. 08:17
반응형

Facade

Facade 패턴은 '하위 시스템을 보다 쉽게 사용할 수 있게 해주는 인터페이스를 정의하는 것'

Adapter 패턴과 거의 같은 방식으로 작동하지만, 목적이 다르다.

  • Adapter : 원래 코드를 다른 코드와 작동할 수 있도록 하는 Wrapper를 제공
  • Facade : 원래 코드를 더 쉽게 처리할 수 있는 Wrapper를 제공

객체나 클래스, 인터페이스가 복잡할 경우, 쉽게 사용할 수 있도록 프론트 인터페이스를 제공하는 형태.

  • 캡슐화되지 않은 코드를 처리할 때 / 원하는 코드를 다시 작성할 수 없을 때 주로 사용한다.
  • 단, 원래의 클래스, 인터페이스 코드가 변경될 경우 Facade 패턴도 변경해야 한다.

패턴의 특징

  • 여러 복잡한 클래스를 하나로 간주해서 편하게 다루는 방법
  • 따라서, 최소 단위로 클래스를 설계하는 게 가능해진다.

클래스를 세분화하지 않고 사용했을 경우, 비슷한 기능이 필요한 새 객체를 생성할 때 불편할 수 있음

  • ex) Computer, Light, Radio라는 클래스를 생성하지 않고 Home이라는 클래스에 해당 기능을 구현 -> Computer가 필요한 또다른 공간 객체(Office 같은)가 필요하면? Computer에 해당하는 기능을 Home
public class ComplexProduct {
    char nameChars[] = new char[10];
    public ComplexProduct() {}
    // 0부터 9까지 이런 형태의 코드가 있음.
    public void setFirstNameCharacter(char c) { nameChar[0] = c; }
    // ... 데이터를 넣기 매우 불편한 코드구조를 임의로 구현.
}

public class SimpleProductFacade {
    ComplexProduct difficultProduct;
    public SimpleProductFacade() { this.difficultProduct = new ComplexProduct(); }

    public void setName(String n) {
        char chars[] = n.toCharArray();
        if (char.length > 0) difficultProduct.setFirstNameCharacter(chars[0]);
        // ... 이런 형태로 구현.
    }
    public String getName() { return difficultProduct.getName(); }
}

public class TestFacadePattern {
    public static void main(String[] args) {
        SimpleProductFacade simpleProductFacade = new SimpleProductFacade();
        simpleProductFacade.setName("printer");
        System.out.println("this product is a " + simpleProductFacade.getName());
    }
}
public class Light {
    private boolean turnedOn = false;

    public void turnOn() {
        this.turnOn = true;
        Systeom.out.println("Light on");
    }
    public void turnOff() {
        this.turnOn = false;
        Systeom.out.println("Light off");
    }
    public boolean isTurnedOn() { return turnedOn; }
}
// 이외에도 Computer / Radio 등의 객체도 있다고 할 때

public class HomeFacade {
    private Light light;

    public HomeFacade(Light light) {
        this.light = light;
    }

    public void homeIn() {
        if (!light.isTurnedOn()) light.turnOn();
    }
    public void homeOut() {
        if (light.isTurnedOn()) light.turnOff();
    }
}

public class TestFacadePattern {
    public static void main(String[] args) {
        Light light = new Light();
        // facade 없이, 집에서 나간다고 할 때
        light.turnOff();
        // 다른 객체들도 각자 전부 turnOff() 메소드를 호출해야 함

        // facade패턴 적용 시
        HomeFacade home = new HomeFacade(light);
        home.homeIn();
    }
}
반응형

'학습일지 > Language' 카테고리의 다른 글

Go - Context 정리  (0) 2022.05.26
JIT Compiler  (0) 2021.03.11
[Design Pattern] Strategy  (0) 2020.12.24
[Design Pattern] Bridge  (0) 2020.12.23
[Design Pattern] Decorator  (0) 2020.12.22