퍼사드 패턴
1. 정의
퍼사드 패턴을 알아보기 전에 퍼사드의 의미를 짚어봅시다.
퍼사드 : 외관; 건물의 정면; 표면
그럼 퍼사드 패턴은 무엇일까요?
퍼사드 패턴 : 여러 서브 시스템을 간략하게 사용할 수 있게 해주는 패턴
간단히 한마디로 정리하자면, 인터페이스를 단순화하기 위해서 인터페이스를 변경하는 것입니다. 속은 보이지 않고 겉면만 볼 수 있죠. 작업 수행의 복잡성은 숨기고 사용자들에게는 간단한 인터페이스로 제공하는 패턴입니다. 그래서 퍼사드 패턴은 구름과 같다(Facade is like Cloud) 라고 표현하기도 합니다.
2. 예제
퍼사드 패턴을 아주 잘 설명해주는 사례가 있습니다. 바로 컴퓨터를 부팅하는 순간인데요. 사용자(User)는 컴퓨터가 부팅되기 위해 CPU와 Memory, HardDrive가 어떻게 작동하는 지 구체적으로 알 필요가 없죠. 그저 컴퓨터를 이용하기 위해 전원 버튼만 눌러주면( run() ) 됩니다.
UML Class Diagram을 구현한 코드는 다음과 같습니다.
Computer.java
public 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 run() {
cpu.processData();
memory.load();
hardDrive.readdata();
}
}
CPU.java
public class CPU {
public void processData() {
System.out.println("processing data...");
}
}
Memory.java
public class Memory {
public void load() {
System.out.println("loading memory...");
}
}
HardDrive.java
public class HardDrive {
public void readdata() {
System.out.println("reading data from hard drive...");
}
}
User.java (App)
public class User {
public static void main(String[] args) {
Computer computer = new Computer();
computer.run();
}
}
User 클래스는 이제 컴퓨터 전원 버튼을 누르기만 하면 됩니다. 이렇게 퍼사드 패턴을 적용하면 코드도 단순해지고 다른 클래스들이 바뀔 걱정이 없으며 이렇게 쓰는게 맞는지 고민하지 않아도 됩니다.
이외에도 실생활에서 퍼사드 패턴을 적용할 수 있는 사례들을 많이 찾아 볼 수 있습니다. 자판기(vending mahcine)도 음료수를 뽑아 마실 경우에 자판기 내부에서 일어나는 일련의 과정을 마시려고 하는 사람이 알 필요가 없습니다. 단지 사용자는 돈을 넣고 음료수가 나오면 마시면 되는 거죠.
3. Checklist
3.1 사용용도
- 복잡한 서브 시스템에 대해 간단한 인터페이스를 제공하고자 할 때
- Client와 구현 클래스간에 또는 서브 시스템과 다른 서브 시스템들간에 의존관계가 많을 경우에 이를 감소시킬 때 -> 각 서브 시스템들은 독립성과 이식성이 높아지게 됩니다.
3.2 장점
- Client 입장에서 서브 시스템을 사용해야 할 때 다루어야 할 객체의 수를 줄여줍니다.
- Client와 서브시스템 간의 결합도가 높아 복잡할 때 Facade 패턴을 활용합니다.
3.3 단점 : 사용자에게 내부 서브 시스템까지 숨길 수는 없습니다.
- Client가 서브 시스템 내부의 클래스를 직접 사용하는 것을 막을 수 없습니다.
=> Namespace를 선언하는 것이 대안 !
3.4 주의사항 : Facade 클래스가 Client에게 제공되는 인터페이스가 변경되지 말아야 합니다.
4. Appendix
4.1 어댑터 패턴과 퍼사드 패턴의 차이?
4.2 어댑터 패턴과 브릿지 패턴의 차이?