본문 바로가기

책리뷰/헤드퍼스트 디자인패턴

헤드퍼스트 디자인패턴 - 옵저버 패턴

728x90
반응형

목차

     

    가상 모니터링 애플리케이션 알아보기


    • Weather-O-Rama와 계약하면 WeatherData객체로 현재조건, 기상통계, 기상예보 
      3가지 항목이 제공된다.
    • 디스플레이 장비에 업데이트 하는 부분은 직접 개발 해야 한다.

     

    가상 스테이션 코드 구현


    WeatherData
    --------------------
    getTemperature()
    getHumidity()
    getPressure()
    measurementsChanged()

     

    • Weather클래스에는 가장 최근에 측정된 온도, 습도, 기압 값을 리턴하는 메소드가 있다
    • WeatherData에서 갱신된 값을 가져올 때마다 measurementsChanged() 메소드가 호출된다. 
    • 디스플레이를 구현하려면 3가지 요소를 구현해야한다. 
    • 디스플레이 업데이트하도록 measurementsChanged()메소드에 코드를 추가해야한다.

    아래쪽에 각각의 Display 를 구현하는 부분은 다른 디스플레이 항목을 추가하려면 프로그램을 고쳐야한다. 

    update시 파라미터를 넘기는 부분도 바뀔 수 있는 부분이다.

     

     

    옵저버 패턴 이해하기


    신문 구독 매커니즘을 생각하면 된다.

    신문사는 구독하는 구독자에게 신문을 제공하고 구독자는 구독을 원하지 않으면 구독을 해제한다.

     

    옵저버 패턴의 정의


    한 객체의 상태가 바뀌면 그 객체에 의존하는 다른객체에게 연락이 가고 자동으로 내용이 갱신되는 방식.

    일대다 의존성을 정의한다.

     

     

    느슨한 결합


    객체들이 상호작용할 수 있지만 서로 잘 모르는 관계(옵저버 패턴은 느슨한 결합)

     

    옵저버 패턴에서의 느슨한 결합

    • 주제는 옵저버가 특정 인터페이스(Observer 인터페이스)를 구현한다는 사실만 안다.
    • 옵저버는 언제든지 새로 추가할 수 있다.
    • 새로운 형식의 옵저버를 추가할 때도 주제를 변경할 필요가 없다.
    • 주제와 옵저버는 서로 독립적으로 재사용할 수 있다.
    • 주제나 옵저버가 달라져도 서로 영향을 미치지 않는다.

    ☝🏻 디자인 원칙 

    상호작용하는 객체 사이에는 가능하면 느슨한 결합을 사용해야 한다.

    • 느슨하게 결합하는 디자인을 사용하면 변경사항이 생겨도 무난히 처리할 수 있는 유연한 객체지향 시스템을 구축할 수 있음

     

     

    가상 스테이션 구현하기


     

    풀 방식으로 코드 바꾸기


    옵저버가 필요할 때마다 주제로부터 데이터를 당겨오는 방식. 

     

    주제에서 알림보내기

    public void notifyObservers() {
        observers.stream().forEach(
            o -> o.update()
        );
    }

    update메소드를 인자없이 호출하도록 수정 

     

    옵저버에서 알림받기

    public interface Observer {
        public void update();
    }

    Observer 인터페이스에서 update() 메소드에 매개변수가 없도록 변경 

     public void update() {
        this.temperature = weatherData.getTemperature();
        this.humidity = weatherData.getHumidity();
        this.pressure = weatherData.getPressure();
        display();
    }

    update() 메소드의 코드를 고친다. 

    getter메서드를 사용해서 값을 가져온다. 

     

     

    핵심정리


    • 옵저버 패턴은 객체들 사이에 일대다 관계를 정의
    • 주제는 동일한 인터페이스를 써서 옵저버에게 연락
    • Observer 인터페이스를 구현하기만 하면 어떤 구상 클래스의 옵저버라도 패턴에 참여할 수 있음
    • 주제는 옵저버들이 Observer인터페이스를 구현한다는 것을 제외하면 옵저버에 관혜 전혀 모름(느슨한 결합)
    • 옵저버 패턴을 사용하면 주제가 데이터를 보내거나 옵저버가 데이터를 가져올 수 있다.(일반적으로 풀방식이 더 옳다고함)
    • 스윙은 다른 여러 GUI 프레임워크와 마찬가지로 옵저버 패턴을 많이 사용함
    • Rx Java, 자바빈, RMI 외에 코코아나 스위프트, 자바스크립트와 같은 다른 언어의 프레임워크에서도 옵저버 패턴을 많이 사용함
    • 옵저버 패턴은 여러 개의 주제와 메시지 유형이 있는 복잡한 상황에서 사용하는 출판-구독 패턴과 친척
    728x90
    반응형