Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Facade pattern

Facade는 건물의 외관을 의미한다. 여러 클래스를 사용 해야 한다고 가정해보면, 개발자는 각각의 클래스로 부터 객체를 만들어서 사용해야 할 것이고, 각 클래스의 세부동작을 알고 있어야 할 것이다. Computer클래스가 있다고 가정해보자. 이 컴퓨터를 끄고, 켜기 위해서는 CPU, 메모리, 하드, 운영체제 등 수많은 작업을 수행해야 한다. 객체지향에서는 이 각각의 요소들을 클래스로 지정 할 건데, 결국 개발자는 컴퓨터를 켜기 모든 클래스에 대해서 정통해야만 할 것이다.

Facade 클래스는 이러한 작업들을 대신해주는 클래스다. 컴퓨터 사용자가 버튼만 누르면 컴퓨터가 작동하듯이, 개발자는 Facade 클래스에서 제공하는 PowerOn버튼만 누르면 된다. 개발이 단순해질 것이다.

 Facade pattern

예제

package main

import (
    "fmt"
)

type CPU struct {
}

type Memory struct {
}

type Disk struct {
}

func (d *Disk) Ready() {
    fmt.Println("Disk ready success.")
}

func (d *CPU) WarmUp() {
    fmt.Println("CPU Warm up ok.")
}

func (d *Memory) Test() {
    fmt.Println("Memory test ok.")
}

type Computer struct {
    Memory
    Disk
    CPU
}

func NewPC() *Computer {
    return &Computer{
        Memory{},
        Disk{},
        CPU{},
    }
}

func (c *Computer) PowerOn() error {
    c.Memory.Test()
    c.Disk.Ready()
    c.CPU.WarmUp()
    fmt.Println("Power On success")
    return nil
}

func main() {
    myPc := NewPC()
    myPc.PowerOn()
}

		

Computer 구조체는 Memory, Disk, CPU 구조체를 포함하고 있다. Memory, Disk, CPU는 파워가 들어왔을 때, 자신을 준비하기 위한 메서드들을 가지고 있다. 나는 PowerOn 메서드를 만들어서, 이들 객체들의 메서드들을 호출했다. 이제 개발자는 컴퓨터 파워를 올리기 위한 세부 사항을 모드더라도 내가 준비한 PowerOn 메서드를 호출 하는 것으로 컴퓨터를 파워온 상태로 만들 수 있을 것이다.

이처럼 Facade 패턴은 여러 개의 서브시스템으로 구성된 시스템을 설계하는데 특히 유용하다.