Java/Design Pattern

[헤드퍼스트 디자인 패턴] 7-2. 퍼사드 패턴

noahkim_ 2024. 12. 17. 19:23

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다

 

1. 퍼사드 패턴

  • 복잡한 서브시스템을 하나의 단순한 인터페이스로 감싸는 디자인패턴
  • 복잡도를 감추어, 클라이언트가 쉽게 사용하도록 하는것이 목적

 

2. 예제: 홈시어터 퍼사드

예제) HomeTheaterFacade

더보기
public class HomeTheaterFacade {
    Amplifier amp;
    Tuner tuner;
    StreamingPlayer player;
    Projector projector;
    TheaterLights lights;
    Screen screen;
    PopcornPopper popper;
    
    public void watchMovie(String movie) {
    	popper.on();
        popper.pop();
        lights.dim(10);
        screen.down();
        projector.on();
        projector.wideScreenMode();
        amp.on();
        amp.setStreamingPlayer(player);
        amp.setVolumne(5);
        player.on();
        player.play(movie);
    }
}

 

3. 최소 지식 원리

  • 객체 사이의 상호작용은 가까운 사이에만 이루어지도록 하기 (불필요한 직접 접근을 피하기)
  • 간접 참조를 통해 정보 은닉과 유지보수성을 높임

 

장점

장점 설명
결합도 감소
클라이언트와 서브시스템 간의 의존성 줄어듦
코드 재사용성 향상
서브시스템 기능을 모듈화해 여러 곳에서 재활용 가능
유지보수성 향상
변경이 퍼사드 내부에 한정되어 수정이 쉬움

 

예시

구분 설명 기대 효과
메서드 체이닝 피하기 외부에서 객체 내부 구조에 직접 접근하지 않음
객체의 내부 메서드를 통해 필요한 기능만 노출
내부 구조 은닉
결합도 감소
유지보수성 향상
헬퍼 객체 활용하기 하나의 메서드가 여러 객체에 직접 접근하지 않음
중간에 헬퍼 객체를 둬서 간접적으로 작업 처리
역할 분리
복잡성 감소
테스트 용이

 

 

예) 메서드 체이닝 피하기

더보기

Order order = customer.getOrder();
order.getItem().doSomething();

 

customer.processOrder();

 

예) 헬퍼 객체 활용하기

더보기

public class Customer {
    private Order order;

    public void processOrder(OrderProcessor processor) {
        processor.process(order);
    }
}

public class OrderProcessor {
    public void process(Order order) {
        order.validate();
        order.calculateTotal();
        order.confirm();
    }
}

 

public class Customer {
    private Order order;

    public void processOrder() {
        order.validate();
        order.calculateTotal();
        order.confirm();
    }
}