영권's
디자인 패턴(Behavioral) - Observer 본문
옵저버 패턴(observer pattern)은 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다.
주로 분산 이벤트 핸들링 시스템을 구현하는 데 사용된다.
발행/구독 모델로 알려져 있기도 하다.
이 패턴의 핵심은 옵저버 또는 리스너(listener)라 불리는 하나 이상의 객체를 관찰 대상이 되는 객체에 등록시킨다. 그리고 각각의 옵저버들은 관찰 대상인 객체가 발생시키는 이벤트를 받아 처리한다.
- Subject(관찰 대상자)의 역할
- Subject는 "관찰되는 대상" 을 나타냅니다. Subject 역할은 관찰자인 Observer 역할을 등록하는 메소드와 삭제하는 메서드를 갖고 있습니다.
- 또 "현재의 상태를 취득하는" 메서드도 선언되어 있습니다.
- ConcreteSubject(구체적인 관찰 대상자)의 역할
- ConcreteSubject은 구체적으로 '관찰되는 대상'을 표현하는 역할입니다.
- 상태가 변화하면 그것이 등록되어 있는 Observer 역할에 전합니다.
- Observer(관찰자)
- Observer는 Subject 역할로부터 '상태가 변했습니다'라고 전달 받는 역할을 합니다.
- 이를 위한 메서드는 update() or notify() 입니다.
- ConcreteObserver(구체적인 관찰자)의 역할
- 구체화된 Observer로 update 메서드가 호출되면 그 메서드 안에서 Subject 역할의 현재 상태를 취득합니다.
Applicability
- 개체의 상태를 변경해야 할 수 있고 실제 개체 집합을 미리 알 수 없거나 동적으로 변경되는 경우 관찰자 패턴을 사용합니다.
- GUI의 클래스로 작업할 때 이런 문제가 발생할 수 있습니다.
- 예를 들어 사용자 정의 버튼 클래스를 생성하고 클라이언트가 사용자 정의 코드를 버튼에 연결하여 사용자가 버튼을 누를 때마다 실행되도록 하고 싶습니다.+
- 프로그램에서 한 객체가 다른 객체를 관찰해야 할 때 패턴을 사용합니다. 단, 제한된 시간 동안 또는 특정한 경우에만 패턴을 사용합니다.
- 구독 목록은 동적이기 때문에 가입자는 필요할 때마다 목록에 가입하거나 탈퇴할 수 있습니다.
장점
- Open/Closed Principle 를 따른다
- 게시자(Subject)의 코드를 변경하지 않고도 새 구독자(Observer) 클래스를 도입할 수 있습니다(게시자 인터페이스가 있는 경우 그 반대도 마찬가지).
- 런타임에 개체 간의 관계를 설정할 수 있습니다.
단점
- Subscribers are notified in random order. (구독자는 무작위 순서로 알림을 받습니다.)
출처 :
도서) Java언어로 배우는 디자인 패턴 입문
https://refactoring.guru/design-patterns/observer
https://ko.wikipedia.org/wiki/%EC%98%B5%EC%84%9C%EB%B2%84_%ED%8C%A8%ED%84%B4
'스터디 > 디자인 패턴' 카테고리의 다른 글
디자인 패턴(Behavioral) - Visitor (0) | 2021.09.10 |
---|---|
디자인 패턴(Behavioral) - Template Method (0) | 2021.09.02 |
디자인 패턴(Behavioral) - Memento (0) | 2021.08.20 |
디자인 패턴(Behavioral) - Iterator (0) | 2021.08.13 |
디자인 패턴(Behavioral) - Command (0) | 2021.08.11 |
Comments