본문 바로가기
SW 공부/Design Patterns

[디자인패턴] Observer Pattern(옵저버 패턴)

by 꼬냉상 2022. 8. 27.

Purpose of Observer Pattern ( 옵저버 패턴의 목적)

aka) Publish / Subscribe model

- Lets one or more objects be notified of state changes in other objects within the system.

- 하나 이상의 개체에 시스템 내의 다른 개체의 상태 변경을 알리기 위해서

 

Design Principle (디자인원칙)

- loose coupling  (서로 거의 모름)

 

Observer Pattern (옵저버 패턴)

- The Observer Pattern defines a one-to-many dependency between objects so that when one object changes state, all of its dependents are notified and updated automatically.

- 옵저버 패턴은 일대다 종속성을 정의하여, 하나의 개체의 상태를 변경하면 종속성이 있는 모두에게 자동으로 통지되고 업데이트된다.

-  Observable (Publisher) / Observer (Subscriber) , 신문 구독 서비스로 이해하면 쉬움

 

 

- Java의 Official Observable Class를 생각하면 됨

 

Quiz) Observer 패턴에서 약한 커플링(loose coupling)이 어떻게 달성되는지 간략히 설명하시오.

- Subject Object와 Observer가 서로를 거의 알지 못하지만 상호 작용할 수 있을 때, loose coupling이 달성된 것.

Subject는 Observer가 특정 인터페이스를 구현하는 것만 알고, Subject나 Observer가 변화가 서로 영향을 미치지 않는다.  Subject를 변경하지 않고, 언제든지 새로운 유형의 Observer를 추가할 수 있다.

 

Quiz) Observer 패턴을 사용할 때, Publisher 역할을 수행하는 객체가 여러 개 있을 수 있는가?

- 가능하다. Observer 패턴에 참여하고 있는 복수개의 클래스들이 Publisher의 역할을 할 수 있으며, Subscriber들은 원하는 복수개의 Publisher에 구독 신청을 할 수 있다. 또한 어떤 클래스는 Publisher이면서 다른 Publisher의 Subscriber가 될 수도 있다.

- Example

public class Publisher_A extends Observable implements Observer {
    public void update(Observable obs, Object arg) { … }
    …
}

Quiz) 다음의 문제를 풀기 위해 적용할 수 있는 패턴의 이름을 쓰시오.
"도메인 로직 레이어(Domain Logic Layer)와 UI(User Interface) 레이어를 분리하여 시스템을 개발하고 있다.
만일 도메인 로직 레이어의 객체들의 상태에 변화가 생기면, 그 사실을 UI 레이어에 있는 다수의 객체들에게 전달하고 싶다. 이때 도메인 로직 레이어의 객체들은 가급적 UI 레이어 객체들에 대한 결합도를 최대한 낮추고 싶다. "
=> Observer Pattern

 

Quiz) O/X 로 답하시오
- (O) Observer 패턴에서 감시자를 추가할 때 Subject 자체에 코드를 추가하지 않으면서도 확장할 수 있는 것은 OCP를 적용한 예이다.

- (X) Observer 패턴에서 Subject의 상태에 관심을 갖는 새로운 감시자(Observer) 객체를 추가하기 위해서는 Subject class에 코드 수정이 필요하다.

 → Subject를 변경하지 않고, 언제든지 새로운 유형의 Observer를 추가할 수 있다.

 

본 글은 개인의 S/W 구조설계 역량 강화를 위한 학습 목적으로 정리된 내용입니다.
일부 타/개인 단체에 저작권이 있는 자료를 포함하고 있으므로, 절대 영리 목적으로 사용하실 수 없습니다.
반응형

댓글