Facade

복잡성을 감추기 위해 단순화된 인터페이스를 제공하는 구조적 디자인 패턴

잡한 시스템에 단순화되고 높은 수준의 인터페이스를 제공하여 클라이언트가 시스템과 더 쉽게 상호 작용할 수 있도록 하는 구조적 디자인 패턴이다.

퍼사드 패턴의 구성

  • Facade: 클라이언트가 하위 시스템에 액세스하는 진입점, 기본 하위 시스템의 복잡성을 추상화하고 숨기는 단순화된 고급 인터페이스를 제공

  • 하위 시스템: 복잡한 시스템을 구성하는 개별 구성 요소 또는 클래스

아래 코드는 퍼사드 패턴을 사용하여 복잡한 하위 시스템을 단순화된 인터페이스로 래핑하는 방법을 보여준다.

// 하위 시스템
class SubSystem1 {
    public void doSomething() {
        System.out.println("SubSystem1");
    }
}

class SubSystem2 {
    public void doSomething() {
        System.out.println("SubSystem2");
    }
}

class SubSystem3 {
    public void doSomething() {
        System.out.println("SubSystem3");
    }
}

// 퍼사드
class Facade {
    private SubSystem1 subSystem1;
    private SubSystem2 subSystem2;
    private SubSystem3 subSystem3;

    public Facade() {
        this.subSystem1 = new SubSystem1();
        this.subSystem2 = new SubSystem2();
        this.subSystem3 = new SubSystem3();
    }

    public void doSomething() {
        subSystem1.doSomething();
        subSystem2.doSomething();
        subSystem3.doSomething();
    }
}

class Client {
    Facade facade = new Facade();

    // 퍼사드를 통해 하위 시스템에 접근
    public void doSomething1() {
        facade.doSomething();
        // ...
    }

    public void doSomething2() {
        facade.doSomething();
        // ...
    }
}

퍼사드 패턴의 이점

  • 클라이언트 코드 단순화: 사용하기 쉬운 단일 인터페이스를 제공하여 클라이언트 코드를 단순화(하위 시스템의 복잡성을 은닉)

  • 유지보수성 향상: 복잡한 시스템에 대한 변경 사항이 Facade 클래스 내에 포함되어 코드베이스의 유지 보수 용이성 향상

파사드 패턴을 이용한 순환 참조 해결

  • 순환 참조: 두 개 이상의 클래스가 서로에 대한 참조를 보유하고 있는 상태

순환 참조는 객체 지향 프로그래밍에서 흔히 발생하는 문제로, 순환 참조가 발생하면 코드를 이해하기 어려워지고 유지보수가 어려워진다. 이 문제는 파사드 패턴을 사용하여 해결할 수 있다.

  • 순환 참조가 발생하는 코드

class ClassA {
    private ClassB classB;

    public ClassA() {
        this.classB = new ClassB();
    }

    public void doSomething() {
        // ...
    }

    public void useClassB() {
        classB.doSomething();
    }
}

class ClassB {
    private ClassA classA;

    public ClassB() {
        this.classA = new ClassA();
    }

    public void doSomething() {
        // ...
    }

    public void useClassA() {
        classA.doSomething();
        // ...
    }
}
  • 퍼사드 패턴을 사용하여 순환 참조 해결

class ClassA {
    private ClassB classB;

    public ClassA(ClassB classB) {
        this.classB = classB;
    }

    public void doSomething() {
        // ...
    }

    public void useClassB() {
        classB.doSomething();
    }
}

class ClassB {
    // ClassA를 필드로 가지고 있지 않음
//    private ClassA classA;

    public ClassB() {
    }

    public void doSomething() {
        // ...
    }

    // ClassA를 사용하는 메서드 삭제
//    public void useClassA() {
//        classA.doSomething();
//        // ...
//    }
}

class Facade {
    private ClassA classA;
    private ClassB classB;

    public Facade() {
        this.classA = new ClassA(this.classB);
        this.classB = new ClassB(this.classA);
    }

    public void useClassAwithClassB() {
        classA.doSomething();
        classB.doSomething();
        // ...
    }
}

ClassB에서 ClassA를 필요로 했던 메서드를 별도의 Facade 클래스로 분리하여 ClassB가 더이상 ClassA를 필요로 하지 않도록 하여 순환 참조를 해결할 수 있다.

Last updated

Was this helpful?