옵저버 패턴(Observer Pattern) 은 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에게 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다(ont-to-many) 의존성을 정의한다.
주제(subject) + 구독자(observer) = 옵저버 패턴
구독자는 주제를 구독하고, 각 주제들은 각 주제의 구독자들에게 해당 주제를 준다.ex) 시청자가 유튜버를 구독하면, 유튜브가 올린 미디어가 구독자(시청자)에게 보여진다.
❗️ 주의
출판-구독(Publish-Subsribe) 패턴 이랑 다른 패턴이다.
출판-구독 패턴은 출판사와 구독자를 더 세세하게 분리할 수 있는 복잡한 패턴이다. 미들웨이 시스템에서 종종 쓰인다.
상호 작용하는 객체 사이
에는 가능하면느슨한 결합
을 사용한다.
느슨한 결합(Losse Coupling):
객체들이 상호작용할 수는 있지만, 서로를 잘 모르는 관계를 의미한다.상호 작용하는 객체 사이 단어의 의미
주제 X와 주제 Y
주제X와 옵저버A
옵저버A와 옵저버B 등등
예시
하드웨어를 통해 온도, 기압, 습도 등 기후 정보를 가져와서 디스플레이에 보여주고 싶다.
하지만 각각의 디스플레이는 보여주고 싶은 화면이 다르다.
- 1번 디스플레이:
온도, 습도, 기압
- 2번 디스플레이:
평균 기온, 최저 기온, 최대 기온
- 3번 디스플레이:
온도에 따른 날씨 이미지
- ex) 영하 3도면 눈 내리는 이미지- 4번 디스플레이: 클라이언트가 직접
매번 다르게 디스플레이 요소를 더하거 뺴고 싶은 상황
> 이런 상황을 미리 대처하기 위해유연한 확장성이 필요함
1. 각각의 디스플레이는 원하는 요소가 다르다. `DisplayElement.interface` 를 만들고, 각각의 디스플레이는 이 인터페이스를 구현한다.
- 그리고 각 디스플레이들은 인터페이스에 따라
distpaly.class
를 자기 입맛대로 구현한다.
- 디스플레이가 화면을 보여주기 전에 기후 정보를 가져와야 한다. 즉 하드웨어 에서 기후 정보가 업데이트 될 때 마다 모든 디스플레이에게 기후 정보가 변했음을 알려줘야 한다.
Observer.interface
를 만든다. 이 인터페이스는update.class
메서드를 가지고 있고,update()
를 하는 순간 모든 디스플레이에게 업데이트를 알린다. 즉 하드웨어에서 기후 정보를 보내주면 update()를 실행하고, 변경 된 정보들을 구독자(디스플레이들)들에게 알려준다.주제(신문사): 하드웨어 센서
구독자: 디스플레이들
각각의 디스플레이들은 하드웨어 센서를
구독(Observer)
하고Observer.interface
, 자신이 원하는 화면을 보여줄DisplayElement.interface
를구성(Composition)
한다.
주제는 옵저버가 특정 인터페이스를 구현한다는 사실만 안다.
옵저버는 언제든지 새로 추가할 수 있다.
주제와 옵저버는 서로 독립적으로 재사용할 수 있다.
주제나 옵저버가 달라져도 서로에게 영향을 미치지 않는다.
새로운 형식의 옵저버를 추가할 때도 주제를 변경할 필요가 전혀 없다.
옵저버 패턴 을 이용하면
새로운 주제 또는 옵저버
즉 새로운 클래스가 추가 되도 코드가 서로 의존되지 않고 독립적으로 확장할 수 있다.
> 행동 패턴
,개방폐쇄 원칙
객체지향 원칙
- 바뀌는 부분은
캡슐화
한다.- 상속 보다는
구성(Composition)
을 활용한다.- 구현보다는
인터페이스에 맞춰서
프로그래밍한다.- 상호작용하는 객체 사이에서는 가능하면
느슨한 결합
을 사용해야 한다.
PropertyChangeEvents
로 유형 속성이 바뀌었을 때 PropertyChangeListener
에 알림을 보내 주는 기능을 제공한다.Flow API
와 관련된 출판-구독 구성 요소
도 제공한다.
선생님 네이버 메일로 질문을 보내드렸는데 실례가 되지않는다면 확인한번만 부탁드려도될까요 ?