퍼사드 패턴

퍼사드(프랑스어: façade[fəˈsɑːd] 영어: facade) 패턴(외관 패턴)은 소프트웨어 공학 디자인 패턴 중 하나이다. 객체 지향 프로그래밍 분야에서 자주 쓰인다. Facade (외관)는 "건물의 정면"을 의미한다.

퍼사드클래스 라이브러리 같은 어떤 소프트웨어의 다른 커다란 코드 부분에 대한 간략화된 인터페이스를 제공하는 객체이다.

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

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

구조

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

예제

[편집]

Java

[편집]

아래 Java 코드 예제는 사용자(you)가 퍼사드(컴퓨터)를 통해 컴퓨터 내부의 부품(CPU, HDD) 등을 접근한다는 내용의 추상적인 예제이다.

/* 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(); 	} } 

C#

[편집]
// 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();     }   } } 

같이 보기

[편집]

외부 링크

[편집]