{{위키데이터 속성 추적}}
[[파일:UML DP Façade.png|thumb]]
'''퍼사드'''({{llang|fr|façade}}{{IPA|[fəˈsɑːd]}} {{llang|en|facade}}) '''패턴'''(외관 패턴)은 [[소프트웨어 공학]] [[디자인 패턴]] 중 하나이다. [[객체 지향 프로그래밍]] 분야에서 자주 쓰인다. Facade (외관)는 "건물의 정면"을 의미한다.

[[퍼사드]]는 [[라이브러리|클래스 라이브러리]] 같은 어떤 소프트웨어의 다른 커다란 코드 부분에 대한 간략화된 인터페이스를 제공하는 객체이다.
* 퍼사드는 [[라이브러리|소프트웨어 라이브러리]]를 쉽게 사용할 수 있게 해준다. 또한 퍼사드는 [[라이브러리|소프트웨어 라이브러리]]를 쉽게 이해할 수 있게 해 준다. 퍼사드는 공통적인 작업에 대해 간편한 메소드들을 제공해준다.
* 퍼사드는 라이브러리를 사용하는 코드들을 좀 더 읽기 쉽게 해준다.
* 퍼사드는 라이브러리 바깥쪽의 코드가 라이브러리의 안쪽 코드에 의존하는 일을 감소시켜 준다. 대부분의 바깥쪽의 코드가 퍼사드를 이용하기 때문에 시스템을 개발하는 데 있어 유연성이 향상된다.
* 퍼사드는 좋게 작성되지 않은 API의 집합을 하나의 좋게 작성된 API로 감싸준다.

래퍼(wrapper)가 특정 인터페이스를 준수해야 하며, 폴리모픽 기능을 지원해야 할 경우에는 [[어댑터 패턴]]을 쓴다. 단지 쉽고 단순한 인터페이스를 이용하고 싶을 경우에는 퍼사드를 쓴다.

== 구조 ==
; 퍼사드
: 퍼사드 클래스는 패키지 1,2,3 및 그림에 나오지 않은 그 밖의 응용 프로그램 코드와 상호 동작한다.
; 클라이언트
: 패키지 내의 리소스들을 접근하기 위해 퍼사드 클래스를 쓰는 객체들이다.
; 패키지
: 소프트웨어 라이브러리 / API 집합이다. 퍼사드 클래스를 통해 접근된다.

== 예제 ==
=== Java ===
아래 Java 코드 예제는 사용자(you)가 퍼사드(컴퓨터)를 통해 컴퓨터 내부의 부품(CPU, HDD) 등을 접근한다는 내용의 추상적인 예제이다.
<syntaxhighlight lang="java">
/* 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) {
		...
	}
}

/* Façade */

class Computer {
	public void startComputer() {
        CPU cpu = new CPU();
        Memory memory = new Memory();
        HardDrive hardDrive = new HardDrive();
		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) throws ParseException {
		Computer facade = /* grab a facade instance */;
		facade.startComputer();
	}
}
</syntaxhighlight>

=== C# ===

<syntaxhighlight lang="csharp">
// Facade pattern -- Structural example

using System;

namespace DoFactory.GangOfFour.Facade.Structural
{

  // Mainapp test application

  class MainApp
  {
    public static void Main()
    {
      Facade facade = new Facade();

      facade.MethodA();
      facade.MethodB();

      // Wait for user
      Console.Read();
    }
  }

  // "Subsystem ClassA"

  class SubSystemOne
  {
    public void MethodOne()
    {
      Console.WriteLine(" SubSystemOne Method");
    }
  }

  // Subsystem ClassB"

  class SubSystemTwo
  {
    public void MethodTwo()
    {
      Console.WriteLine(" SubSystemTwo Method");
    }
  }

  // Subsystem ClassC"

  class SubSystemThree
  {
    public void MethodThree()
    {
      Console.WriteLine(" SubSystemThree Method");
    }
  }

  // Subsystem ClassD"

  class SubSystemFour
  {
    public void MethodFour()
    {
      Console.WriteLine(" SubSystemFour Method");
    }
  }

  // "Facade"

  class Facade
  {
    SubSystemOne one;
    SubSystemTwo two;
    SubSystemThree three;
    SubSystemFour four;

    public Facade()
    {
      one = new SubSystemOne();
      two = new SubSystemTwo();
      three = new SubSystemThree();
      four = new SubSystemFour();
    }

    public void MethodA()
    {
      Console.WriteLine("\nMethodA() ---- ");
      one.MethodOne();
      two.MethodTwo();
      four.MethodFour();
    }

    public void MethodB()
    {
      Console.WriteLine("\nMethodB() ---- ");
      two.MethodTwo();
      three.MethodThree();
    }
  }
}
</syntaxhighlight>

== 같이 보기 ==
* [[캡슐화]]
== 외부 링크 ==
* {{언어링크|en}} [http://c2.com/cgi/wiki?FacadePattern Description from the Portland Pattern Repository]
* {{언어링크|en}} [https://web.archive.org/web/20080820095638/http://www.netobjectivesrepository.com/TheFacadePattern Description from the Net Objectives Repository]
* {{언어링크|en}} [https://web.archive.org/web/20081120002138/http://www.fsw.com/Jt/Jt.htm Jt] J2EE Pattern Oriented Framework

{{디자인 패턴(소프트웨어)}}

[[분류:소프트웨어 디자인 패턴]]