[Design Pattern] 파사드 패턴 (Facade Pattern)

반달곰수·2023년 11월 22일
0

파사드 패턴 ?

  • 일련의 저수준 서브 인터페이스를 통합된 고수준 인터페이스로 묶어주는 패턴
  • 복잡한 시스템이나 , 서브시스템의 인터페이스를 단순화 시켜 클라이언트가 시스템과 상호 작용하기 쉽게 해줌
  • 클라이언트에게 단순화된 인터페이스를 제공하므로 , 클라이언트는 시스템의 내부 구현을 알 필요가 없어짐
  • 서브시스템의 변경이나 업그레이드가 필요한 경우 , 이를 파사드 내부에서만 처리하면 되므로 , 내부 구현의 변경이 클라이언트 코드에 미치는 영향이 최소화 됨

예제

  • 각각의 야채 클래스
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();
    }
}

언제 사용하면 좋을까 ?

  • 복잡한 시스템을 단순화할 때
  • 클라이언트 코드를 간소화하고 , 캡슐화할 때
  • 시스템의 일부를 재사용 하려고 할 때
    • 새로운 기능 , 서브 시스템을 추가할 때 파사드의 확장을 통해 클라이언트 코드에는 영향을 미치지 않도록 할 수 있음

단점

  • 유연성 감소
    • 파사드 패턴을 통해 간소화된 인터페이스를 제공하지만 , 이로 인해 클라이언트가 직접 서브시스템의 세부사항에 접근하지 못함
  • 파사드 클래스의 책임 증가
    • 파사드 클래스는 클라이언트와 서브시스템 사이의 중간다리 역할을 하기 때문에 시스템이 복잡해질수록 파사드 클래스의 책임은 커질 수 있고 , 이로 인해 단일 책임의 원칙을 위반할 수 있음

0개의 댓글