파사드 패턴 개요
파사드(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() 메서드만 호출하면 됩니다.