퍼사드 패턴(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을 사용하면 하나의 객체만을 호출하여 사용할 수 있고, 그 객체의 네이밍 역시 간단명료할 수밖에 없다.
서브 시스템 직접 접근 가능
필요에 따라 서브 클래스를 직접 사용할 수도 있다. 선택지가 많아짐.