퍼사드 패턴이란?

 

Facade = 겉모습

 

모처럼 쉬운 패턴이다.

 

1) 어려운 설명

복잡한 라이브러리나 API를 사용할때 복잡한 서브시스템의 인터페이스집합은 뒤로 감추고

통일된 간단한 인터페이스만 표면에 나타내는 패턴

 

2) 쉬운 설명

그냥 A함수, B함수, C함수, D함수가 있다고 할 때

F함수를 만들고 F함수 내에 A, B, C, D함수 내용을 다 복붙해서 때려 넣었다고 생각해보자.

그럼 사용자 입장에선 A(); B(); C(); D(); 해야할 일을 간단하게 F(); 하나로 사용할 수 있다.

이걸 그냥 함수가 아닌 클래스 수준으로 사용한다라고 보면 된다.

 

 

 

퍼사드 패턴의 구조

 

위처럼 BIOS클래스, CPU클래스, MEMORY클래스, HDD클래스가 있을때 각 클래스의 operation()함수를 사용하려면

bios->operation();
cpu->operation();
memory->operation();
hdd->operation();

처럼 4번 써야한다.

이걸 그냥 Computer클래스를 만들어서 Booting()함수를 만들고 그 안에 다 때려넣는다면

void Booting() {
	bios->operation();
	cpu->operation();
	memory->operation();
	hdd->operation();
}

처럼 만들고 그냥 Booting() 한줄로 끝낼 수 있다.

 

물론 모든 함수가 매개변수가 필요없거나 필요한 매개변수가 모두 같다면 위처럼 간단하겠지만 모두 다르다면

void Booting(int A, int B, int C, int D) {
	bios->operation(A);
	cpu->operation(B);
	memory->operation(C);
	hdd->operation(D);
}

처럼 단지 Booting(A, B, C, D)로 쓰면 될 뿐이다.

 

결국 사용자 입장에서 겉모습이 간단해보이도록 정리하는 패턴이라고 보면 된다.

 

 

 

구현 코드 예시

 

위에서 한 설명처럼 여러 함수의 기능을 하나의 함수에 때려넣듯이

다양한 클래스들의 기능을 하나의 클래스에 때려넣었을 뿐이다.

 

1) 예시코드

#include <iostream>
using namespace std;

class BIOS
{
public:
    void operation() { cout << "BIOS Loading...\n"; }
};

class CPU
{
public:
    void operation() { cout << "CPU Loading...\n"; }
};

class MEMORY
{
public:
    void operation() { cout << "Memory Loading...\n"; }
};

class HDD
{
public:
    void operation() { cout << "HDD Loading...\n"; }
};

class Computer
{
private:
    BIOS* mBios;
    CPU* mCpu;
    MEMORY* mMemory;
    HDD* mHdd;

public:
    Computer(BIOS* a, CPU* b, MEMORY* c, HDD* d) 
        : mBios(a), mCpu(b), mMemory(c), mHdd(d) 
    {}

void Booting() {
        cout << "Computer Booting Start\n";

        mBios->operation();
        mCpu->operation();
        mMemory->operation();
        mHdd->operation();

        cout << "Computer Booting Complete\n";
    }
};

int main()
{
    BIOS bios;
    CPU cpu;
    MEMORY memory;
    HDD hdd;

    Computer mComputer(&bios, &cpu, &memory, &hdd);
    mComputer.Booting();

    return 0;
}

 

2) 실행결과

 

 

 

 

 

※ 참고 문헌

https://copynull.tistory.com/138

https://d-yong.tistory.com/47?category=700951