파사드 패턴 ?
- 일련의 저수준 서브 인터페이스를 통합된 고수준 인터페이스로 묶어주는 패턴
- 복잡한 시스템이나 , 서브시스템의 인터페이스를 단순화 시켜 클라이언트가 시스템과 상호 작용하기 쉽게 해줌
- 클라이언트에게 단순화된 인터페이스를 제공하므로 , 클라이언트는 시스템의 내부 구현을 알 필요가 없어짐
- 서브시스템의 변경이나 업그레이드가 필요한 경우 , 이를 파사드 내부에서만 처리하면 되므로 , 내부 구현의 변경이 클라이언트 코드에 미치는 영향이 최소화 됨
예제
public class Carrot {
public void chop() {
System.out.println("당늘 썰기");
}
public void add() {
System.out.println("당근 넣기");
}
}
public class Garlic {
public void chop() {
System.out.println("마늘 썰기");
}
public void add() {
System.out.println("마늘 넣기");
}
public class Onion {
public void chop() {
System.out.println("양파 썰기");
}
public void add() {
System.out.println("양파 넣기");
}
}
- 여러 클래스가 통합된 로직을 요리 파사드 클래스에 구현
public class CookFacade {
private final Carrot carrot;
private final Garlic garlic;
private final Onion onion;
public CookFacade(Carrot carrot, Garlic garlic, Onion onion) {
this.carrot = carrot;
this.garlic = garlic;
this.onion = onion;
}
public void cook() {
carrot.chop();
garlic.chop();
onion.chop();
carrot.add();
garlic.add();
onion.add();
}
}
public class Main {
public static void main(String[] args) {
Carrot carrot = new Carrot();
Garlic garlic = new Garlic();
Onion onion = new Onion();
//파사드 미적용
//여러 클래스가 연결된 로직이 클라이언트에 그대로 노출됨
carrot.chop();
garlic.chop();
onion.chop();
carrot.add();
garlic.add();
onion.add();
}
}
public class Main {
public static void main(String[] args) {
Carrot carrot = new Carrot();
Garlic garlic = new Garlic();
Onion onion = new Onion();
CookFacade cookFacade = new CookFacade(carrot,garlic,onion);
//파사드 적용
//클라이언트는 단순히 CookFacade 메서드 호출을 통해 요리를 시작할 수 있음
cookFacade.cook();
}
}
언제 사용하면 좋을까 ?
- 복잡한 시스템을 단순화할 때
- 클라이언트 코드를 간소화하고 , 캡슐화할 때
- 시스템의 일부를 재사용 하려고 할 때
- 새로운 기능 , 서브 시스템을 추가할 때 파사드의 확장을 통해 클라이언트 코드에는 영향을 미치지 않도록 할 수 있음
단점
- 유연성 감소
- 파사드 패턴을 통해 간소화된 인터페이스를 제공하지만 , 이로 인해 클라이언트가 직접 서브시스템의 세부사항에 접근하지 못함
- 파사드 클래스의 책임 증가
- 파사드 클래스는 클라이언트와 서브시스템 사이의 중간다리 역할을 하기 때문에 시스템이 복잡해질수록 파사드 클래스의 책임은 커질 수 있고 , 이로 인해 단일 책임의 원칙을 위반할 수 있음