ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Observer Pattern
    디자인 패턴 2022. 2. 3. 19:25

    해당 책을 통해 공부한 내용을 정리하고 있습니다.

     


     

    Observer Pattern

    옵저버 패턴을 이해하려면 신문사의 ‘구독’ 시스템을 생각하면 편하다. 신문을 구독하면 다음과 같은 프로세스로 나에게 신문이 도착하게 된다.

    1. 신문사에 구독을 신청한다.
    2. 신문사에서 뉴스를 배포할 구독자를 파악한다
    3. 구독자에게 새로운 뉴스를 배포한다.
    4. 옵저버 패턴 또한 위의 패턴과 같이 동작한다고 생각하면 편하다. 신문사 역할을 하는 ‘Subject’가 있고 구독자 역할을 하는 ‘Observer’가 있다. 만약 Subject의 상태가 변화하게 된다면 변화된 값을 Observer들에게 전달하는 방식으로 진행된다. 보통 밑과 같은 형식으로 구성된다.

     

     

    Loose Coupling

     

     옵저버 패턴은 객체들 간의 ‘느슨한 결합’을 제공한다. Subject, Observer 인터페이스를 구현하는 구체 클래스는 상대편의인터페이스를 구현하는 구체 클래스가 무엇을 하는지에는 관심이 없다. 자신의 역할에 해당하는 인터페이스만 구현하면 둘 다 Observer Pattern에서의 역할을 수행 할 수 있다. 즉 옵저버가 무엇이고, Subject가 무엇으로 교체되건 간에 서로에게 영향을 미치지는 않는다.

     

    이러한 객체 결합을 Loose Coupling이라고 하며, 이런 객체 결합을 사용한다면 변경 사항이 생기더라도 무난히 처리할 수 있는 유연한 객체지향 시스템을 구현 할 수 있다.

     

     

    Push vs Pull

     

     옵저버 패턴은 Push 방식, Pull 방식으로 나뉜다. Push 방식은 Subject가 주가 되어 자신의 상태가 갱신될 때마다 모두 notify로 Observer에게 전달해주는 방식을 의미하고, Pull 방식은 Observer가 주가되어 자신이 원하는 데이터를 Subject로부터 가져오는 방식이다.

     

     

    Java.util.Observer

     

     자바 기본 제공 라이브러리인 java.util.observable, java.util.observer를 통해 Observer 패턴의 pull 기능을 손쉽게 구현 할 수 있다. 각각은 다음의 이미지와 같이 구성되어있다.

     여기서 Observable은 인터페이스가 아니라 객체임에 유의하자. ConcreteSubject는 Observable 객체를 상속받은 객체가 된다. 해당 라이브러리에서 Push방식을 쓰려면 notifyObserver()를 사용하면 된다. Pull 방식을 사용하려면 위에서 못봤던 메소드인 setChanged() 메소드를 쓰고 난 뒤 notifyObserver()를 사용하면된다.

     

     

    setChanged()

     setChanged 메소드는 상태가 바뀌었다는 것을 밝히기 위한 용도로 쓰인다. 그러고 나서 나중에 notifyObservers() 메소드가 호출되었을 때 그 메소드에서 옵저버들을 갱신시키게 된다. setChanged() 메소드가 호출되어있지 않은 상태에서 notifyObservers()가 호출되면 옵저버들에게 아무 연락도 가지 않게 된다.

     

     굳이 이런 것을 사용하는 이유는 상태값을 갱신하는데 있어서 유연성을 제공해주기 위해서다. 예를들어 일반적으로 집에서 사용하는 온도계에서 사용하는 프로그램이 온도 변화가 0.0001도마다 변화를 줄 필요는 없으니 0.1도 정도의 변화가 생길때만 setChanged() 메소드를 호출하면 시스템에 부하를 주지 않고 사용 할 수 있을 것이다.

    '디자인 패턴' 카테고리의 다른 글

    Factory Pattern  (0) 2022.02.14
    Decorator Pattern  (0) 2022.02.08
    Strategy Pattern  (0) 2022.02.02
    싱글톤 패턴(Singleton Pattern)  (0) 2021.10.28
    Facade Pattern  (0) 2021.10.27

    댓글

Designed by Tistory.