
퍼사드 패턴(Facade Pattern)은 구조 패턴(Structural Pattern)의 한 종류로써,
복잡한 서브 클래스들의 공통적인 기능을 정의하는 상위 수준의 인터페이스를 제공하는 패턴이다.
퍼사드 객체(Facade Object)는 서브 클래스의 코드에 의존하는 일을 감소시켜 주고, 복잡한 소프트웨어를 간단히 사용 할 수 있게 간단한 인터페이스를 제공해준다.
퍼사드 패턴을 통해 서브 시스템(SubSystem)들 간의 종속성을 줄여줄 수 있으며, 퍼사드 객체를 사용하는 곳(Client)에서는 여러 서브 클래스들을 호출할 필요 없이 편리하게 사용할 수 있다.

여러 SubSystem들의 기능을 하나의 Facade Object로 정의하고, Client가 Facade Object를 사용하는 형태이다.
예를 들어, 세탁이라는 행위에 Facade Pattern을 적용시켜보자.

세탁를 하기 위해서는 크게 Washing, Rinsing, Spinning과 같은 동작들이 필요하다. 이들은 SubSystem들로써, Facade Object를 통해 '세탁'이라는 행위에 필요한 공통 기능들을 정의할 수 있다.
class Rinsing{
void rinse(){
System.out.println("do Rinsing")
}
}
class Spinning{
void spin(){
System.out.println("do Spinning")
}
}
class Washing{
void wash(){
System.out.println("do Washing")
}
}
class Client{
Washing washing = new Washing();
Rinsing rinsing = new Rinsing();
Spinning spinning = new Spinning();
washing.wash();
rinsing.rinse();
spinning.spin();
}
읽기가 힘든 코드이며, 유지보수에 용이하지 않다. Client가 여러 객체들에
강하게 결합되어 있다.
class WashingMachine{
Washing washing = new Washing();
Rinsing rinsing = new Rinsing();
Spinning spinning = new Spinning();
void startWashing(){
washing.wash();
rinsing.rinse();
spinning.spin();
}
}
class Client{
WashingMachine washingMachine = new WashingMachine();
washingMachine.strartWahsing();
}
Client에서는 Facade Object(WashingMachine)만을 호출하여 '세탁'이라는 동작을 수행할 수 있으며, 메서드의 의미 또한 명확하게 알 수 있다.
낮은 결합도
Client가 서브 시스템(SubSystem)들의 코드를 몰라도 된다. Facade Object만 알면 사용이 가능하다. 또한 서브 시스템들간의 복잡한 결합도 역시 낮출 수 있다.
가독성 상승
기존에는 Client에서 여러 서브 클래스들을 직접 호출해야 했다.
하지만 Facade Pattern을 사용하면 하나의 객체만을 호출하여 사용할 수 있고, 그 객체의 네이밍 역시 간단명료할 수밖에 없다.
서브 시스템 직접 접근 가능
필요에 따라 서브 클래스를 직접 사용할 수도 있다. 선택지가 많아짐.