파사드 패턴으로 시스템 복잡도 낮추기

파사드 패턴 개요

파사드(Facade) 패턴은 서브시스템 내 여러 인터페이스에 대한 일관된 진입점을 제공하는 구조적 디자인 패턴입니다. 이 패턴은 상위 수준의 인터페이스를 정의하여 서브시스템을 더 쉽게 사용할 수 있도록 만듭니다.

기본 예제 코드

서브시스템 클래스들


class SubSystem1
{
    public void MethodA()
    {
        Console.WriteLine("서브시스템 메서드1");
    }
}

class SubSystem2
{
    public void MethodB()
    {
        Console.WriteLine("서브시스템 메서드2");
    }
}

class SubSystem3
{
    public void MethodC()
    {
        Console.WriteLine("서브시스템 메서드3");
    }
}

파사드 클래스


class Facade
{
    private SubSystem1 one;
    private SubSystem2 two;
    private SubSystem3 three;

    public Facade()
    {
        one = new SubSystem1();
        two = new SubSystem2();
        three = new SubSystem3();
    }

    public void MethodA()
    {
        one.MethodA();
        two.MethodB();
        three.MethodC();
    }

    public void MethodB()
    {
        one.MethodA();
        two.MethodB();
        three.MethodC();
    }
}

클라이언트 코드


static void Main(string[] args)
{
    Facade f = new Facade();
    f.MethodA();
    f.MethodB();
}

파사드 패턴 적용 시점

  • 설계 초기 단계: 서로 다른 레이어를 분리해야 할 때, 레이어 간에 파사드를 도입하여 의존성을 최소화합니다.
  • 개발 단계: 서브시스템이 리팩토링을 통해 복잡해질 때, 파사드를 추가하여 단순한 인터페이스를 제공하고 의존성을 줄입니다.
  • 유지보수 단계: 기존 레거시 시스템이 복잡하고 확장이 어려우나 중요한 기능을 포함할 때, 새로운 시스템을 위해 파사드 클래스를 만들어 레거시 코드와의 복잡한 상호작용을 캡슐화합니다.

C++ 구현 예제


#include <iostream>
using namespace std;

class Scanner
{
public:
    void Scan()
    {
        cout << "어휘 분석" << endl;
    }
};

class Parser
{
public:
    void Parse()
    {
        cout << "구문 분석" << endl;
    }
};

class CodeGenerator
{
public:
    void GenerateCode()
    {
        cout << "중간 코드 생성" << endl;
    }
};

class MachineCodeGenerator
{
public:
    void GenerateCode()
    {
        cout << "기계어 코드 생성" << endl;
    }
};

class Compiler
{
private:
    Scanner scanner;
    Parser parser;
    CodeGenerator midCodeGen;
    MachineCodeGenerator machineCodeGen;

public:
    void RunCompilation()
    {
        scanner.Scan();
        parser.Parse();
        midCodeGen.GenerateCode();
        machineCodeGen.GenerateCode();
    }
};

int main()
{
    Compiler compiler;
    compiler.RunCompilation();
    return 0;
}

위 C++ 예제에서 Compiler 클래스가 파사드 역할을 수행합니다. 컴파일 과정의 각 단계(어휘 분석, 구문 분석, 중간 코드 생성, 기계어 코드 생성)를 내부적으로 처리하며, 클라이언트는 단순히 RunCompilation() 메서드만 호출하면 됩니다.

태그: C# C++ Facade Pattern Design Patterns Structural Patterns

7월 12일 16:42에 게시됨