본문 바로가기

Design Patterns/영문 위키(Wikipedia)

Facade pattern (퍼사드 패턴)

먼저 이 글은 영문 위키의 글을 번역한 글임을 알려드립니다.

영어 실력이 부족한 관계로 오역이 있을 수도 있습니다.

원문 주소 : http://en.wikipedia.org/wiki/Facade_pattern



구조적 패턴 - 퍼사드 패턴



퍼사드 패턴은 객체 지향 프로그래밍에서 종종 사용되는 소프트웨어 디자인 패턴이다. 그 이름은 건축학의 퍼사드(전면, facade)에서 유추되었다. 

퍼사드는 많은 양의 코드를 단순화된 인터페이스로 제공하는 객체이다. (예를들면 클래스 라이브러리가 있다.)

퍼사드는 다음과 같은 것들을 할 수 있다. 

  • 퍼사드는 공통적인 작업(tasks)에 대해 편리한 메서드를 가지기 때문에, 더 사용하기 쉽고, 이해하기 쉽고, 테스트하기 쉽게 소프트웨어 라이브러리를 만들 수 있다. 
  • 같은 이유로 라이브러리를 더 읽기 쉽게 만들 수 있다.
  • 대부분의 코드가 퍼사드를 사용하기 때문에, 바깥 코드와 라이브러리 안쪽 코드의 의존성(dependency)을 줄일 수 있고, 따라서 시스템을 개발하는데에 더 유연성을 제공한다.
  • 형편없이 설계된 API의 컬렉션을 하나의 잘 설계된 API로 감쌀 수 있다.


감싸는 클래스(wrapper)가 특정 인터페이스를 준수해야하고 다형성(polymorphic)을 지원해야만 한다면 어댑터(adapter)가 사용된다. 반면에, 퍼사드는 더 쉽거나 간단한 인터페이스를 원할 때 사용한다.

구조 Structure


Facde - 퍼사드 클래스는 Package 1, 2, 3을 나머지 애플리케이션으로부터 추상화시킨다.

Clients - Package들의 리소스에 접근하기 위해 퍼사드 패턴을 사용하는 객체

예 Example

이 추상적인 예는 복잡한 시스템에서(CPU와 하드 드라이브 같은 컴퓨터 내부) 클라이언트(당신)가 어떻게 퍼사드(컴퓨터)와 상호작용하는지 보여준다.

/* Complex parts */
 
class CPU {
    public void freeze() { ... }
    public void jump(long position) { ... }
    public void execute() { ... }
}
 
class Memory {
    public void load(long position, byte[] data) { ... }
}
 
class HardDrive {
    public byte[] read(long lba, int size) { ... }
}
 
/* Facade */
 
class Computer {
    private CPU cpu;
    private Memory memory;
    private HardDrive hardDrive;
 
    public Computer() {
        this.cpu = new CPU();
        this.memory = new Memory();
        this.hardDrive = new HardDrive();
    }
 
    public void startComputer() {
        cpu.freeze();
        memory.load(BOOT_ADDRESS, hardDrive.read(BOOT_SECTOR, SECTOR_SIZE));
        cpu.jump(BOOT_ADDRESS);
        cpu.execute();
    }
}
 
/* Client */
 
class You {
    public static void main(String[] args) {
        Computer facade = new Computer();
        facade.startComputer();
    }
}