본문 바로가기
Theory/Design Pattern

Facade Pattern

by y.j 2022. 5. 9.
728x90

Facade Pattern

subsystem에 있는 여러 interface를 통합으로 묶어 줄 수 있는 interface를 정의하는 것이다. Facade는 subsystem을 쉽게 할 수 있도록 도와주는 higher-level interface를 정의하는 것이다.

복잡한 subsystem에 단순한 interface를 어떻게 제공 할 수 있을까?
subsystem에 client와 object사이에 응집도를 어떻게 줄일 수 있을까?

subsystem의 Client는 오직 Facade interface에 대해서만 알고 참조해야만 한다. 또, subsystem에 있는 서로 다른 interface에 대해서 독립적이게 하여 의존을 줄이고 client가 쉽게 구현, 수정, 테스트 그리고 재사용 하기 쉽게 한다.

왼쪽 그림은 subsystem에 있는 class를 모두 직접적으로 참조하고 있어 응집도가 높아진다. 반면, Facade는 결합된 interface로 subsystem을 참조하고 있기 때문에 응집도가 낮아지며 client입장에서 코드가 단순화 된다.

 

solution

Facade가 subsystem에 있는 class들을 생성자로 받아 operation할 수 있도록 한다.

public class Facade1 extends Facade {

    private Class1 class1;
    private Class2 class2;
    private Class3 class3;

    public Facade1(Class1 class1, Class2 class2, Class3 class3) {
        this.class1 = class1;
        this.class2 = class2;
        this.class3 = class3;
    }

    @Override
    public String operation() {
        return "Facade forward to "
                + class1.operation()
                + class2.operation()
                + class3.operation();
    }
}

 

Advantages

• subsystem으로부터 client를 분리시킨다.

 - Facade object를 통해 작동하게 함으로 subsystem으로부터 client는 분리되어진다.

   또, 오로지 Facade object에 대해서만 알고 참조하기 때문에 복잡한 complex subsystem으로부터 독립적이다.

   client입장에서는 구현, 수정, 테스트 그리고 재사용이 쉽다.

• subsystem들도 서로 분리시킬 수 있.

 - system이 복자해져 layer가 많아지면 Facade는 각 시스템의 Facade를 정의하여 subsystem간을 분리할 수 있다.

   또, subsystem간에서도 직접참조하기 보다는 Facade object를 참조하면 되기 때문에 단순화되고 응집도를 낮출수 있다.

 

[전체 코드]

https://github.com/jKyounju/adapterPatterns/tree/master/src/StructurePattern/FacadePattern

 

728x90

'Theory > Design Pattern' 카테고리의 다른 글

Chain Of Responsibility Pattern  (0) 2022.05.10
Flyweight Pattern  (0) 2022.05.09
Decorator Pattern  (0) 2022.05.08
Composite Pattern  (0) 2022.05.05
Proxy Pattern  (0) 2022.04.24

댓글